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

时间:2014-02-11 00:16:04

标签: ios iphone uiimage core-graphics 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;
}

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

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

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

1 个答案:

答案 0 :(得分: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路径)的关键是通过做出明智的选择来最小化工作量。

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