首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIImage遮罩在iPhone上显示黑色背景(而不是在模拟器中)

UIImage遮罩在iPhone上显示黑色背景(而不是在模拟器中)
EN

Stack Overflow用户
提问于 2010-07-21 17:47:29
回答 2查看 2.4K关注 0票数 1

我已经得到了没有alpha通道的蒙版图像,纯黑和白色,中间有一个黑色的多边形,中间被白色包围。

我已经得到了png的图像,我想要屏蔽它。png有一个alpha通道。使用下面的方法:在模拟器上可以,但在设备上背景是黑色的…有什么办法解决这个问题吗?

代码语言:javascript
复制
- (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];

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-23 00:11:33

问题已解决:解决方案是:要遮罩的图像必须使用alpha通道创建。Alpha通道可能不是从代码创建的。

票数 2
EN

Stack Overflow用户

发布于 2010-07-21 20:03:41

下面的代码与这里相同

代码语言:javascript
复制
- (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;

}

代码语言:javascript
复制
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设备上效果不佳:所有图像都被遮罩,但背景为黑色。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3297994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档