2

我有一个带有 alpha 通道的 300 x 400 px 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 / 透明度和 opaque=NO。

4

2 回答 2

0

小心 - 代码泄漏!直到在循环中运行此方法时我才注意到它。确保在返回图像之前调用CGImageRelease(mask)and 。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;
}
于 2013-09-09T14:29:55.327 回答
0

我猜你的代码来自这里。有这样的评论:

我已经改进了代码,以便它可以正确屏蔽没有 Alpha 通道的图像。

因此,如果它对您不起作用,那么您的图像可能没有 Alpha 通道。

于 2009-07-16T08:53:09.120 回答