UIImage 遮罩在 iPhone 上提供黑色背景(而不是在模拟器中)
Posted
技术标签:
【中文标题】UIImage 遮罩在 iPhone 上提供黑色背景(而不是在模拟器中)【英文标题】:UIImage masking gives black background on the iPhone (and not in simulator) 【发布时间】:2010-07-21 09:47:28 【问题描述】:我有没有 Alpha 通道的蒙版图像,纯黑色和白色,中心有一个黑色多边形,周围是白色。
我想要屏蔽 png 的图像。 png 有一个 alpha 通道。 使用下面的方法:在模拟器上可以,但设备上的背景是黑色的...... 有什么办法解决这个问题吗?
- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
//CGImageRelease(mask);
//CGImageRelease(maskRef);
return [UIImage imageWithCGImage:masked];
【问题讨论】:
【参考方案1】:问题已解决: 解决方案是:要屏蔽的图像必须使用 alpha 通道创建。 Alpha 通道可能不是通过代码创建的。
【讨论】:
我也面临同样的问题。您能否发布一些有关如何创建 Alpha 通道的代码示例? 谢谢蒂比。对我来说,maskImage 有一个 alpha 通道也很重要。所以由于 ios7 BOTH 图像,要遮罩的图像和遮罩本身必须有一个 alpha 通道。【参考方案2】:下面的代码也一样
- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef sourceImage = [image CGImage];
CGImageRef imageWithAlpha = sourceImage;
//add alpha channel for images that don't have one (ie GIF, JPEG, etc...)
//this however has a computational cost
if (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone)
imageWithAlpha = CopyImageAndAddAlphaChannel(sourceImage);
CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask);
//const float colorMasking[6] = 100,100, 100, 250,250, 250;
//CGImageRef maskedImageRef = CGImageCreateWithMaskingColors(temp.CGImage, colorMasking);
CGImageRelease(mask);
//release imageWithAlpha if it was created by CopyImageAndAddAlphaChannel
if (sourceImage != imageWithAlpha)
CGImageRelease(imageWithAlpha);
UIImage* retImage = [UIImage imageWithCGImage:masked];
CGImageRelease(masked);
return retImage;
CGImageRef CopyImageAndAddAlphaChannel(CGImageRef sourceImage)
CGImageRef retVal = NULL;
size_t width = CGImageGetWidth(sourceImage);
size_t height = CGImageGetHeight(sourceImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height,
8, 0, colorSpace, kCGImageAlphaPremultipliedFirst);
if (offscreenContext != NULL)
CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage);
retVal = CGBitmapContextCreateImage(offscreenContext);
CGContextRelease(offscreenContext);
CGColorSpaceRelease(colorSpace);
return retVal;
在模拟器上完美运行,但不能在 iPhone 设备上运行:所有图像都被蒙版,但背景为黑色。
【讨论】:
我使用了你的代码,我认为问题在于“CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone”这一行。就我而言,这总是错误的,不要强迫!!添加 Alpha 通道。添加 Alpha 通道始终有效。以上是关于UIImage 遮罩在 iPhone 上提供黑色背景(而不是在模拟器中)的主要内容,如果未能解决你的问题,请参考以下文章