Por que a minha máscara de imagem fazer a minha imagem em preto, onde a máscara é branca?

StackOverflow https://stackoverflow.com/questions/1136195

  •  16-09-2019
  •  | 
  •  

Pergunta

I têm um 300 x 400 px PNG-24 com alfa canal. Trata-se de 140kb. Eu quero mascarar algumas partes que, por isso criei uma outra imagem 300 x 400 como PNG-24, mas com apenas preto, cinza e branco e nenhum canal alfa.

O estranho é: Onde a máscara é preta, a imagem é apenas manteve originais. Sem transparência. Mas onde a máscara é branca, a imagem fica apenas preto preto. Sem transparência.

Ele funciona parcialmente em imagens muito pequenas, como 50 x 50 px. Alguma idéia do que pode estar errado com essa função?

+ (UIImage*)maskImage:(UIImage*)image withMask:(UIImage*)maskImage {

    CGImageRef maskRef = maskImage.CGImage;
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), 
                                        NULL, false);

    CGImageRef theImage = image.CGImage;
    CGImageRef masked = CGImageCreateWithMask(theImage, mask);
    return [UIImage imageWithCGImage:masked];
}

Meu fundo é laranja, para que esta cor deve brilhar. O UIImageView que mantém a imagem está definido para clearColor / transparência e opaco = NO.

Foi útil?

Solução

Eu acho que o seu código é daqui . Há este comentário:

Eu melhorei o código para que ele possa mascarar correctamente as imagens que não têm um canal alfa.

Então, se ele não funcionar para você, talvez sua imagem não tem um canal alfa.

Outras dicas

Tenha cuidado - que vazamentos de código! Eu não notá-lo até executar este método em um loop. Certifique-se de CGImageRelease(mask) chamada e CGImageRelease(masked) antes de retornar a imagem.

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

    CGImageRef maskRef = maskImage.CGImage;

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), NULL, false);
    CGImageRef masked = CGImageCreateWithMask(image.CGImage, mask);

    UIImage *img = [UIImage imageWithCGImage:masked];

    //otherwise we will leak
    CGImageRelease(mask);
    CGImageRelease(masked);

    return img;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top