CGImageCreateWithMask工作得很好,但是在我生成的图像中,蒙面区域是黑色的,如何将其设置为白色?

时间:2010-10-03 03:21:26

标签: iphone objective-c quartz-graphics

我已经掩盖了我的形象:

    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 个答案:

答案 0 :(得分:9)

如果您正在屏蔽没有Alpha通道的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);

...

务必释放创建的图像,上下文和颜色空间......

答案 1 :(得分:0)

图像应该是透明的,它被“屏蔽掉”;你看到的颜色取决于你画的是什么背景。

(我不记得是否要求源图像有alpha通道。)

值得确保imageView.opaque = NO

答案 2 :(得分:0)

试试这个:

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

此外,用于遮罩的图像应为黑白(不透明)。

答案 3 :(得分:0)

我正在努力解决同样的问题。解决方案非常简单: 最好以这种方式创建图形上下文:

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 (这意味着不透明的上下文)。 另一个好处是这个创建功能自动将上下文缩放到视网膜显示。