3

我正在尝试在我的应用程序中创建一个功能,允许用户提取现有图像的指定区域,并将其保存为启用 alpha 的 png。

当您在透明UIView的. 对于绘图,我使用. 用户可以在对象周围绘制,内部将暂时用黑色填充。UIImageViewimageViewviewUIBezierPath

用户从相册中选取图像,并显示在底层UIImageView,如左图所示,当用户绘制了一个形状(自动关闭)时,在上层UIView,它看起来像右图:

不戴口罩 带上拉面罩

这按预期工作,但是当用户单击“裁剪”时,魔法应该开始了。到目前为止,我只能创建一个“蒙版”并将其保存为卷上的图像,如此处所示(不管纵横比,我稍后会修复它):

已保存 图像和生成的

这只是一个普通图像,由路径/形状创建,具有颜色(白底黑,透明底黑)。我需要的是某种方法来使用这个“图像”作为原始图像的 alpha 通道。

我知道这是两个完全独立的东西,alpha 通道与图像不同,但我有形状,所以我想知道是否有任何可能的方法来“裁剪”或“输出 alpha”用我的数据。我想要最终得到的是这只猫脸的 png,周围环境 100% 透明(或者甚至不透明),这样我就可以更改背景,如下所示:

透明的白色背景 透明橙色背景

重要的是要注意,我不是在谈论UIImageUIImageView应用蒙版中显示一个通道,从而像上面一样保存一张具有透明度的图像。

我对处理图像数据不太熟悉,所以我想知道是否有人知道如何基于两张图像创建一个新图像,一张充当另一个图像的 alpha,而这两个图像都不一定有 alpha 通道首先。

4

2 回答 2

3

下面的方法将获取您的原始图像和蒙版图像(黑色形状)并返回UIImage仅包含蒙版覆盖的图像内容的 a:

+ (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *) mask
{
    CGImageRef imageReference = image.CGImage;
    CGImageRef maskReference = mask.CGImage;

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference),
                                             CGImageGetHeight(maskReference),
                                             CGImageGetBitsPerComponent(maskReference),
                                             CGImageGetBitsPerPixel(maskReference),
                                             CGImageGetBytesPerRow(maskReference),
                                             CGImageGetDataProvider(maskReference),
                                             NULL, // Decode is null
                                             YES // Should interpolate
                                             );

    CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask);
    CGImageRelease(imageMask);

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference];
    CGImageRelease(maskedReference);

    return maskedImage;
}

蒙版之外的区域将是透明的。然后,您可以将结果UIImage与背景颜色结合起来。

于 2013-08-04T00:34:31.867 回答
0

它对我不起作用。我不确定为什么 objC 让事情变得如此困难,我可以简单地将 UIImage 转换为例如 openCV Mat,将掩码添加为第 4 个通道,然后返回 UIImage

于 2022-02-26T16:45:06.347 回答