如何使用 Accelerate Framework 将带有遮罩的图像组合成一个 UIImage?

Posted

技术标签:

【中文标题】如何使用 Accelerate Framework 将带有遮罩的图像组合成一个 UIImage?【英文标题】:How to combine an image with a mask into one single UIImage with Accelerate Framework? 【发布时间】:2014-02-11 00:16:04 【问题描述】:

此代码将一张图片和一张灰度蒙版图片合并到一个 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;

我认为 Accelerate Framework 可以提供帮助。但我不确定。 有vImage,它可以做alpha compositing。或者,也许我要寻找的是“vImage Transform”。不像 CATransform3D,而是“转换”图像。

但我需要的是根据蒙版将照片制作成透明的 JPEG。

可以为此使用 Accelerate Framework 吗?或者有其他选择吗?

【问题讨论】:

【参考方案1】:

VImageOverwriteChannels_ARGB8888 可能是您想要的 API,前提是图像 JPEG 一开始是不透明的。您可以使用 vImageBuffer_InitWithCGImage 将源图像提取为 8 bpc、32 bpp、kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32小。这将为您提供具有不透明 alpha 的 BGRA8888 图像。取出掩码为 8bpc、8bpp、kCGImageAlphaNone 图像。使用 vImageOverwriteChannels_ARGB8888 用新的 alpha 通道覆盖 BGRA alpha。然后用 vImageCreateCGImageFromBuffer 制作一个新的 CGImage,稍微修改格式为 kCGImageAlphaFirst | kCGBitmapByteOrder32Little。

您还可以尝试通过使用上面的 maskedReference 并将其直接解码为 BGRA kCGImageAlphaFirst 来将蒙版展平到图像中。这只有在图像和蒙版大小相同时才真正有效。否则会发生一些重采样,这很耗时。

我不知道其中任何一个是否真的会更快。查看您的时间去向的仪器时间配置文件会很有用。 vImageOverwriteChannels_ARGB8888 可能只是这里要做的一小部分工作。根据原始图像的格式,在 vImageBuffer_InitWithCGImage 和 vImageCreateCGImageFromBuffer 中可能会在幕后进行大量的色彩空间转换和图像格式转换工作。这里(以及竞争 CG 路径)加快速度的关键是通过做出明智的选择来最大程度地减少工作量。

有时,尝试一些东西,然后在没有任何效果的情况下向苹果提交错误可以产生明智的回应。一个简单可重复的例子通常是关键。

【讨论】:

以上是关于如何使用 Accelerate Framework 将带有遮罩的图像组合成一个 UIImage?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Metal API 或 Accelerate Framework 绘制裁剪的位图?

如何使用 Accelerate Framework 将带有遮罩的图像组合成一个 UIImage?

有人可以解释这段代码如何使用 Accelerate Framework 将音量转换为分贝吗?

iOS - 使用 Accelerate.framework 对向量进行按位异或

iOS Accelerate Framework vImage - 性能改进?

在 Swift 中使用 Accelerate Framework 复数支持