为UIImage创建alpha

时间:2013-08-03 17:19:09

标签: ios cocoa-touch uiimage alpha

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

我在UIView上放置UIImageView - imageView显示图片,同时在透明view上绘制遮罩。对于绘图,我使用UIBezierPath。用户可以在对象周围绘制,内部将暂时用黑色填充。

用户从照片卷中选择图像,并在左侧图像中显示在底层UIImageView中,并且当用户绘制了一个形状(自动关闭)时,覆盖UIView,它看起来像是正确的形象:

Without mask With drawn-on mask

这是按预期工作的,但是当用户点击"裁剪"时,应该开始魔术。到目前为止,我只能创建一个"面具"并将其保存为卷筒上的图像,如此处所示(不要介意宽高比,我稍后会修复它):

Saved "mask" Image and the generated "mask"

这只是一个正常的图像,由路径/形状创建,带有颜色(白色为黑色,透明度为黑色)。 我需要的是一些使用它的方法"图像"作为原始图像的alpha通道。

我知道这些是两个完全不同的东西,alpha通道与图像不同,但我有形状,所以我想知道是否有任何可能的方式到"庄稼"或" alpha out"用我的数据。我最终想要的是这只猫的脸,周围100%透明(或者甚至没有),这样我就可以改变背景,像这样:

Transparent white background Transparent orange background

需要注意,我谈论在UIImage中展示UIImageView并应用掩码,我正在谈论基于现有图像创建新图像,结合另一个我想以某种方式转换为第一个图像的alpha通道的图像,从而保存一个像上面一样的图像,具有透明度

我对处理图像数据并不太熟悉,所以我想知道是否有人知道如何基于两个图像创建一个新图像,一个作为另一个图像的alpha,当既不< / strong>图像必须有一个alpha通道开始。

1 个答案:

答案 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与背景颜色合并。