Reputation: 9672
I've masked out my image thusly:
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];
And it works great, but the resulting image has BLACK where it was masked out, how can I set it to have WHITE where its masked out?
Upvotes: 5
Views: 8262
Reputation: 2245
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 ...
Upvotes: 9
Reputation: 19916
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.
Upvotes: 0
Reputation: 19251
Try this:
imageView.opaque = NO;
imageView.backgroundColor = [UIColor clearColor];
Also, the image used to mask should be black and white (not transparent).
Upvotes: 0
Reputation: 33592
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
.
Upvotes: 0