如何使用Accelerate Framework将图像与蒙版合并到一个单独的UIImage中?

iam*_*mer 5 iphone core-graphics uiimage ios accelerate-framework

此代码将图像和灰度蒙版图像组合成一个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;
}
Run Code Online (Sandbox Code Playgroud)

我认为Accelerate Framework可以提供帮助.但我不确定.有vImage,它可以做alpha合成.或者也许我想要的是" vImage变换 ".不像CATransform3D而是"转换"图像.

但我需要的是将照片制作成基于蒙版的透明JPEG.

可以使用Accelerate Framework吗?还是有替代方案吗?

Ian*_*ann 3

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

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

我不知道这两者是否真的会更快。查看您的时间去向的工具时间概况会很有用。vImageOverwriteChannels_ARGB8888 可能只是这里需要完成的一小部分工作。根据原始图像的格式,vImageBuffer_InitWithCGImage 和 vImageCreateCGImageFromBuffer 中可能会在幕后进行大量颜色空间转换和图像格式转换工作。这里(以及竞争的 CG 路径)速度的关键是通过做出明智的选择来最大限度地减少工作量。

有时,尝试一些东西,然后如果没有什么效果,就向苹果提出错误,可以得到明智的回应。一个可简单重现的例子通常是关键。