Почему моя маска изображения делает мое изображение черным, а маска - белым? - PullRequest
2 голосов
/ 16 июля 2009

У меня 300 x 400 пикселей PNG-24 с альфа-каналом. Это около 140 КБ. Я хочу замаскировать некоторые его части, поэтому я создал еще одно изображение размером 300 x 400 в формате PNG-24, но только с черным, серым и белым без альфа-канала.

Странная вещь: где маска черная, изображение остается оригинальным. Нет прозрачности. Но там, где маска белая, изображение становится черным, а не черным. Нет прозрачности.

Работает частично на очень маленьких изображениях, таких как 50 х 50 пикселей. Есть идеи, что может быть не так с этой функцией?

+ (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];
}

Мой фон оранжевый, так что этот цвет должен просвечивать. UIImageView, который содержит изображение, установлен на clearColor / прозрачность и непрозрачный = NO.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2013

Будьте осторожны - этот код просачивается! Я не заметил этого, пока не запустил этот метод в цикле. Обязательно позвоните CGImageRelease(mask) и CGImageRelease(masked) перед возвратом изображения.

- (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;
}
0 голосов
/ 16 июля 2009

Полагаю, ваш код отсюда . Вот этот комментарий:

Я улучшил код, чтобы он мог правильно маскировать изображения, которые не имеют альфа-канал.

Так что, если это не работает для вас, возможно, ваше изображение не имеет альфа-канала.

...