此代码将图像和灰度蒙版图像组合成一个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吗?还是有替代方案吗?
答案 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路径)的关键是通过做出明智的选择来最小化工作量。
有时,尝试一些东西,然后在没有效果的情况下提交针对苹果的错误可以产生明智的反应。一个简单可重复的例子通常是关键。