在我的应用程序中,我需要尽可能快地在上下文中进行大量图像转换。有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
这看起来正是我所需要的。但是我无法有效地使用它。任何建议欢迎。