【问题标题】:How to combine an image with a mask into one single UIImage with Accelerate Framework?如何使用 Accelerate Framework 将带有遮罩的图像组合成一个 UIImage?
【发布时间】: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 吗?或者有其他选择吗?

【问题讨论】:

    标签: ios iphone uiimage core-graphics 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 路径)加快速度的关键是通过做出明智的选择来最大程度地减少工作量。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 2020-04-10
      • 2015-12-18
      • 2014-12-07
      相关资源
      最近更新 更多