问题
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?
回答1:
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 ...
回答2:
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
.
回答3:
Try this:
imageView.opaque = NO;
imageView.backgroundColor = [UIColor clearColor];
Also, the image used to mask should be black and white (not transparent).
回答4:
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.
来源:https://stackoverflow.com/questions/3848430/cgimagecreatewithmask-works-great-but-the-masked-out-area-is-black-in-my-resulti