如何使用 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 对向量进行按位异或