我试图在我的应用中创建一个功能,允许用户提取现有图像的指定区域,并将其保存为启用了Alpha的png。
我在UIView
上放置UIImageView
- imageView
显示图片,同时在透明view
上绘制遮罩。对于绘图,我使用UIBezierPath
。用户可以在对象周围绘制,内部将暂时用黑色填充。
用户从照片卷中选择图像,并在左侧图像中显示在底层UIImageView
中,并且当用户绘制了一个形状(自动关闭)时,覆盖UIView
,它看起来像是正确的形象:
这是按预期工作的,但是当用户点击"裁剪"时,应该开始魔术。到目前为止,我只能创建一个"面具"并将其保存为卷筒上的图像,如此处所示(不要介意宽高比,我稍后会修复它):
这只是一个正常的图像,由路径/形状创建,带有颜色(白色为黑色,透明度为黑色)。 我需要的是一些使用它的方法"图像"作为原始图像的alpha通道。
我知道这些是两个完全不同的东西,alpha通道与图像不同,但我有形状,所以我想知道是否有任何可能的方式到"庄稼"或" alpha out"用我的数据。我最终想要的是这只猫的脸,周围100%透明(或者甚至没有),这样我就可以改变背景,像这样:
需要注意,我不谈论在UIImage
中展示UIImageView
并应用掩码,我正在谈论基于现有图像创建新图像,结合另一个我想以某种方式转换为第一个图像的alpha通道的图像,从而保存一个像上面一样的图像,具有透明度
我对处理图像数据并不太熟悉,所以我想知道是否有人知道如何基于两个图像创建一个新图像,一个作为另一个图像的alpha,当既不< / strong>图像必须有一个alpha通道开始。
答案 0 :(得分:2)
下面的方法将拍摄原始图像和蒙版图像(黑色形状)并返回仅包含蒙版所覆盖图像内容的UIImage
:
+ (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
与背景颜色合并。