为什么我的图像蒙版使我的图像变黑,蒙版是白色的?

时间:2009-07-16 08:30:25

标签: iphone cgimage

我有一个带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。

2 个答案:

答案 0 :(得分:0)

我猜你的代码是from here。有这样的评论:

  

我已经改进了代码以便它可以   正确掩盖没有的图像   一个alpha通道。

因此,如果它对你不起作用,也许你的图像没有alpha通道。

答案 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;
}