我正在尝试在我的应用程序中创建一项功能,允许用户提取现有图像的指定区域,并将其另存为启用了 alpha 的 png。
我在 UIImageView
上放置了一个 UIView
- imageView
显示图像,而您在透明的屏幕上绘制蒙版查看
。对于绘图,我使用 UIBezierPath
。用户可以在对象周围画画,内部会暂时填充黑色。
用户从照片卷中选择图像,它呈现在底层 UIImageView
中,如左图所示,当用户绘制了一个形状(自动关闭)时,在上面UIView
,它看起来像正确的图像:
这按预期工作,但是当用户随后单击“裁剪”时,魔术应该开始了。到目前为止,我只能创建一个“蒙版”并将其保存为卷筒上的图像,如此处所示(不要介意宽高比,稍后我会修复):
这只是一张普通图像,根据路径/形状创建,带有颜色(白色上黑色,透明上不是黑色)。 我需要的是使用此“图像”作为原始图像的 alpha channel 的某种方法。
我知道这是两个完全独立的东西,alpha channel 与图像不同,但我有形状,所以我想知道是否有任何可能的方法来“裁剪”或“alpha out”和我的数据。我最终想要的是这只猫的脸的 png,周围 100% 透明(或什至不透明),这样我就可以更改背景,如下所示:
重要的是要注意,我不是谈论在 UIImageView
中显示 UIImage
应用mask,我说的是创建一个新图像,基于现有图像,结合我想以某种方式转换为第一个图像的 alpha channel 的另一个图像,从而像上面那样保存一个图像,具有透明度。
我不太熟悉处理图像数据,所以我想知道是否有人知道如何基于两张图像创建一张新图像,一张作为另一张的 alpha,当两者都不 的图像必须以 alpha channel 开头。
最佳答案
下面的方法将获取原始图像和蒙版图像(黑色形状)并返回一个 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;
}
mask 外的区域将是透明的。然后,您可以将生成的 UIImage
与背景颜色结合起来。
关于ios - 为 UIImage 创建 alpha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18035364/