我有一个带alpha通道的300 x 400像素PNG-24。它大约140kb。我想掩盖其中的一些部分,所以我创建了另一个300 x 400图像作为PNG-24,但只有黑色,灰色和白色,没有alpha通道。
奇怪的是:如果面具是黑色的,那么图像就保持原始状态。没有透明度。但是在面具是白色的情况下,图像变黑而只是黑色。没有透明度。
它部分适用于50 x 50像素的非常小的图像。知道这个功能可能有什么问题吗?
+ (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 theImage = image.CGImage;
CGImageRef masked = CGImageCreateWithMask(theImage, mask);
return [UIImage imageWithCGImage:masked];
}
我的背景是橙色的,所以这种颜色应该透过。保存图像的UIImageView设置为clearColor / transparency和opaque = NO。
答案 0 :(得分:0)
答案 1 :(得分:0)
小心 - 代码泄漏!直到在循环中运行此方法之前我才注意到它。请务必在返回图片前致电CGImageRelease(mask)
和CGImageRelease(masked)
。
- (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);
UIImage *img = [UIImage imageWithCGImage:masked];
//otherwise we will leak
CGImageRelease(mask);
CGImageRelease(masked);
return img;
}