CGImageCreateWithMask works great but the masked out area is black in my resulting image, how can I set it to be white?

懵懂的女人 提交于 2019-11-30 14:48:34

If you are masking JPEG image which does not have alpha channel this will happen (black background instead of transparent).

So you need to do something like this before masking:

    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);

...

Be sure to release created images, context and colorspace ...

The image is supposed to be transparent where it's "masked out"; the colour you see will depend on what background you're drawing it on.

(I don't remember if there's a requirement that the source image has an alpha channel.)

It may be worth making sure that imageView.opaque = NO.

Try this:

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

Also, the image used to mask should be black and white (not transparent).

I was struggling with the same issue. The solution is pretty simple: It is the best to create graphic context for masking this way:

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);
....

Make sure, the second parameter in UIGraphicsBeginImageContextWithOptions is set to NO (which means none-opaque context). Another benefit is that this creation function automatically scales context to retina displays.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!