ios - 为 UIImage 创建 alpha

标签 ios cocoa-touch uiimage alpha

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

我在 UIImageView 上放置了一个 UIView - imageView 显示图像,而您在透明的屏幕上绘制蒙版查看。对于绘图,我使用 UIBezierPath。用户可以在对象周围画画,内部会暂时填充黑色。

用户从照片卷中选择图像,它呈现在底层 UIImageView 中,如左图所示,当用户绘制了一个形状(自动关闭)时,在上面UIView,它看起来像正确的图像:

Without mask With drawn-on mask

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

Saved "mask" Image and the generated "mask"

这只是一张普通图像,根据路径/形状创建,带有颜色(白色上黑色,透明上不是黑色)。 我需要的是使用此“图像”作为原始图像的 alpha channel 的某种方法。

我知道这是两个完全独立的东西,alpha channel 与图像不同,但我有形状,所以我想知道是否有任何可能的方法来“裁剪”或“alpha out”和我的数据。我最终想要的是这只猫的脸的 png,周围 100% 透明(或什至不透明),这样我就可以更改背景,如下所示:

Transparent white background Transparent orange background

重要的是要注意,我不是谈论在 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/

相关文章:

ios - 在后台任务中添加到 CALayer 时不显示 UIImage

ios - 为什么默认情况下符合 Swift 协议(protocol)的值被视为值类型?

ios - 使用 faSTLane 截取我的 React-Native 应用程序的屏幕截图

ios - 如何拦截按键?

ios - DrawRect 超出 View 范围

swift - WatchKit 检索多个 URL 图像

ios - 使用 indexPath 访问数组内的 UIImage 并创建空的 UIImage 数组元素

objective-c - 如何为 iOS 中的按钮添加声音?

ios - 在 swift 2 中解析 json 对象

iphone - 如何设置不同高度的 UITableViewCell 背景图片?