为什么我的图像遮罩使图像变黑,而遮罩是白色的?

发布于 2024-07-27 14:15:00 字数 1112 浏览 7 评论 0原文

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

I have a 300 x 400 px PNG-24 with alpha channel. It's about 140kb. I want to mask out some parts of that, so I created another 300 x 400 image as PNG-24 but with only black, gray and white and no alpha channel.

The weird thing is: Where the mask is black, the image is just kept original. No transparency. But where the mask is white, the image gets black just black. No transparency.

It works partially on very small images like 50 x 50 px. Any idea what may be wrong with this function?

+ (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];
}

My background is orange, so that this color should shine through. The UIImageView that holds the image is set to clearColor / transparency and opaque=NO.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

坏尐絯℡ 2024-08-03 14:15:00

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

我改进了代码,以便它可以
正确掩盖没有的图像
Alpha 通道。

因此,如果它不适合您,则可能您的图像没有 Alpha 通道。

I guess your code is from here. There is this comment:

I’ve improved the code so that it can
correctly mask images that don’t have
an alpha channel.

So if it doesn't work for you, perhaps your image doesn't have an alpha channel.

相守太难 2024-08-03 14:15:00

小心 - 代码会泄漏! 直到循环运行这个方法我才注意到它。 确保在返回图像之前调用 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;
}

Be careful - that code leaks! I didn't notice it until running this method in a loop. Make sure to call CGImageRelease(mask) and CGImageRelease(masked) before returning the image.

- (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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文