CGImageCreateWithMask отлично работает, но замаскированная область в полученном изображении черная, как я могу установить ее в белый цвет? - PullRequest
5 голосов
/ 03 октября 2010

Я таким образом замаскировал свое изображение:

    CGImageRef maskRef = [[UIImage imageNamed:@"testMask2.png"] CGImage];

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                    CGImageGetHeight(maskRef),
                                    CGImageGetBitsPerComponent(maskRef),
                                    CGImageGetBitsPerPixel(maskRef),
                                    CGImageGetBytesPerRow(maskRef),
                                    CGImageGetDataProvider(maskRef), nil, YES);

UIImage *image = [UIImage imageWithContentsOfFile:path];

CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);

imageView.image = [UIImage imageWithCGImage:masked];

И это прекрасно работает, но результирующее изображение имеет ЧЕРНОЕ, где оно было замаскировано, как я могу установить Белое, где оно замаскировано?

Ответы [ 4 ]

9 голосов
/ 02 апреля 2011

Если вы маскируете изображение JPEG, у которого нет альфа-канала, это произойдет (черный фон вместо прозрачного).

Поэтому перед маскировкой необходимо сделать что-то подобное:

    CGImageRef imageNoAlpha = [UIImage imageNamed:@"noAlphaImage.jpg"].CGImage;

CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();

CGFloat width = CGImageGetWidth(imageNoAlpha);
CGFloat height = CGImageGetHeight(imageNoAlpha);

CGContextRef ctxWithAlpha = CGBitmapContextCreate(nil, width, height, 8, 4*width, cs, kCGImageAlphaPremultipliedFirst);

CGContextDrawImage(ctxWithAlpha, CGRectMake(0, 0, width, height), imageNoAlpha);

CGImageRef imageWithAlpha = CGBitmapContextCreateImage(ctxWithAlpha);

CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask);

...

Обязательно выпустите созданные изображения, контекст и цветовое пространство ...

0 голосов
/ 14 марта 2012

Я боролся с той же проблемой. Решение довольно простое: Для маскировки лучше всего создать графический контекст:

UIGraphicsBeginImageContextWithOptions(maskFrame.size, NO, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect ff =  CGRectMake(0, 0, maskFrame.size.width, mask.size.height);
CGContextClipToMask(ctx, ff, mask.CGImage);
....

Убедитесь, что второй параметр в UIGraphicsBeginImageContextWithOptions установлен в NO (что означает непрозрачный контекст). Еще одно преимущество заключается в том, что эта функция создания автоматически масштабирует контекст для отображения на сетчатке.

0 голосов
/ 30 марта 2011

Попробуйте:

imageView.opaque = NO;
imageView.backgroundColor = [UIColor clearColor];

Кроме того, изображение, используемое для маскировки, должно быть черно-белым (не прозрачным).

0 голосов
/ 03 октября 2010

Изображение должно быть прозрачным там, где оно «замаскировано»; цвет, который вы видите, будет зависеть от того, на каком фоне вы его рисуете.

(я не помню, есть ли требование, чтобы исходное изображение имело альфа-канал.)

Возможно, стоит убедиться, что imageView.opaque = NO.

...