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