如何从CoreImage中提取平面图像?

时间:2016-04-14 17:09:31

标签: ios macos cocoa rendering core-image

在我的应用中,我在需要尽可能快的环境中进行了大量的图像转换。有3个步骤:

1-将数据输入CIImage 2-使用过滤器转换该图像 3-以预期格式提取处理过的像素数据。

我的问题是第3步。我只能使用此调用将输出CIImage渲染为8位RGBA:

CIImage *outputImage = gExitFilter.outputImage;
CGImageRef finalImage = [gCoreImageContext createCGImage:outputImage fromRect:outputImage.extent];
CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(finalImage));

碰巧在某些情况下,我需要平面灰色格式的输出(需要8位整数和32位浮点数。)

当然,在大多数情况下,我可以进一步将上面代码中的数据转换回预期的格式(例如使用vImage)。但这对我来说是浪费。是不是有办法直接将CIImage渲染成某种指定的像素格式?

有些情况下,这种转换步骤实际上无法以无损方式实现:当所需的输出格式为平面32位浮点数时,从8位RGBA转换将非常粗糙。

我希望有一个解决方案,因为第1步允许这样做,使用如下代码:

CIImage *inputImage = [CIImage imageWithBitmapData:self.backingData bytesPerRow:bytesPerRow size:fullSize format:kCIFormatR8 colorSpace:gDeviceGrayColorSpace];

kCIFormatR8这里允许我将平面8位图像输入到CIImage的红色通道中,从中可以轻松地将其复制到其他通道中。

在所有这些背景下,我的问题归结为:

有没有办法将CIImage渲染成单通道平面图像?

(我的应用程序是MacOS X应用程序,但iOS的答案可能也很有趣,也许可以指向正确的方向)

编辑:我找到了这个方法:

- (CGImageRef)createCGImage:(CIImage *)im fromRect:(CGRect)r format:(CIFormat)f colorSpace:(CGColorSpaceRef)cs

看起来它正是我所需要的。但是我无法有效地使用它。任何建议都欢迎。

1 个答案:

答案 0 :(得分:0)

要渲染CIImage的一个频道,您应该:

  • 使用CIColorMatrix过滤器将所需的通道映射到R,G和B。
  • 使用[CIContext render:toBitmap:format:kCIFormatR8]