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

Ios 如何从CoreImage中提取平面图像?,ios,macos,cocoa,rendering,core-image,Ios,Macos,Cocoa,Rendering,Core Image,在我的应用程序中,我在需要尽可能快的环境中进行了很多图像转换。有3个步骤: 1-将数据馈送到CIImage 2-使用过滤器变换图像 3-以预期格式提取处理后的像素数据 我的问题是第三步。我只能使用以下调用将输出图像渲染为8位RGBA: CIImage *outputImage = gExitFilter.outputImage; CGImageRef finalImage = [gCoreImageContext createCGImage:outputImage fromRect:output

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

1-将数据馈送到CIImage 2-使用过滤器变换图像 3-以预期格式提取处理后的像素数据

我的问题是第三步。我只能使用以下调用将输出图像渲染为8位RGBA:

CIImage *outputImage = gExitFilter.outputImage;
CGImageRef finalImage = [gCoreImageContext createCGImage:outputImage fromRect:outputImage.extent];
CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(finalImage));
在某些情况下,我需要平面灰色格式的输出(需要8位整数和32位浮点)

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

在某些情况下,这种转换步骤实际上不可能以无损的方式进行:当所需的输出格式为平面32位浮点时,从8位RGBA进行转换将相当粗糙

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

CIImage *inputImage = [CIImage imageWithBitmapData:self.backingData bytesPerRow:bytesPerRow size:fullSize format:kCIFormatR8 colorSpace:gDeviceGrayColorSpace];
kCIFormatR8
在这里,我可以将一个平面8位图像输入到CIImage的红色通道中,通过过滤器可以轻松地将其复制到其他通道中

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

有没有办法将图像渲染为单通道平面图像

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

编辑:我发现这个方法:

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

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

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

  • 在R、G和B的所需通道上使用CIColorMatrix过滤器SPL
  • 使用[CIContext render:toBitmap:format:kCIFormatR8]