Ios 为UIImage创建alpha

Ios 为UIImage创建alpha,ios,cocoa-touch,uiimage,alpha,Ios,Cocoa Touch,Uiimage,Alpha,我正在尝试在我的应用程序中创建一个功能,允许用户提取现有图像的指定区域,并将其保存为启用alpha的png 我已将ui视图放在ui图像视图的顶部-当您在透明的视图上绘制遮罩时,图像视图显示图像。对于绘图,我使用的是UIBezierPath。用户可以在对象周围绘制,内部将临时填充黑色 用户从照片卷中拾取图像,并将其显示在基础的UIImageView中,如左图所示,当用户在覆盖的UIView上绘制了一个形状(自动关闭)时,它看起来像右图: 这是预期的工作,但当用户点击“作物”,然后魔术应该开始。

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

我已将
ui视图
放在
ui图像视图
的顶部-当您在透明的
视图
上绘制遮罩时,
图像视图
显示图像。对于绘图,我使用的是
UIBezierPath
。用户可以在对象周围绘制,内部将临时填充黑色

用户从照片卷中拾取图像,并将其显示在基础的
UIImageView
中,如左图所示,当用户在覆盖的
UIView
上绘制了一个形状(自动关闭)时,它看起来像右图:

这是预期的工作,但当用户点击“作物”,然后魔术应该开始。到目前为止,我只能创建一个“遮罩”并将其保存为卷上的图像,如图所示(不必担心纵横比,我稍后会解决这个问题):

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

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

重要的是要注意我说的不是在
UIImageView
中使用应用的遮罩显示
UIImage
,我说的是基于现有图像创建一个新图像,并结合另一个图像,我想以某种方式将其转换为第一个图像的alpha通道,这样就可以像上面那样保存一张透明的图像


我不太熟悉处理图像的数据,所以我想知道是否有人知道如何基于两个图像创建新图像,一个作为另一个的alpha,当两个图像都不一定有alpha通道开始时。

下面的方法将取原始图像和遮罩图像(黑色形状)并返回仅包含遮罩覆盖的图像内容的
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
与背景色结合起来。

谢谢,一两天后我会检查这个,但这看起来像是第二个图像的alpha,然后应用到第一个图像上,我认为我正在创建的形状上也没有alpha通道,因为它不是w、 但我会想办法做到这一点。我想在这一点上,两张图片的大小也应该完全相同。我会尝试一些东西,希望很快能得到好消息:)这终于奏效了。我发现我已经试过了,但结果是,我发送的一张图像中有一个虚拟的alpha通道把它搞砸了。在发送到该方法之前将两者转换为JPEG时,它工作得非常好,谢谢。(但似乎它在iOS7上不起作用)