2016-04-14 68 views
0

在我的应用程序中,我需要尽可能快地在上下文中进行大量图像转换。有3个步骤:如何从CoreImage提取平面图像?

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 

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

回答

0

要渲染CIImage你应该仅一个信道:

  • 使用CIColorMatrix滤波器图示的期望的信道,以在R,G和B.
  • 用[CIContext渲染:toBitmap:格式:kCIFormatR8 ]