从CGImageRef获取原始RGB缓冲区

时间:2015-04-30 08:16:07

标签: objective-c cgimage

我试图直接访问指针CGImageRef的底层RGB缓冲区。我的第一次尝试如下:

CGImageRef image = [...];
CFDataRef rawData = CGDataProviderCopyData(CGImageGetDataProvider(image));
const UInt8 * buf = CFDataGetBytePtr(rawData);
int length = CFDataGetLength(rawData);

但是如果我将长度length与宽度和高度的乘积进行比较,这就是我得到的:

size_t w = CGImageGetWidth(image);
size_t h = CGImageGetHeight(image);
CGColorSpaceRef color_space = CGImageGetColorSpace(image);
size_t nsamples = CGColorSpaceGetNumberOfComponents ( color_space );
assert( length == w * h * 4 && nsamples == 3 );

我可以理解some circumstances(主要是显示目的),操作RGBA(或ARGB)缓冲区更容易,但在我的特定情况下,我只需要解压缩RGB(= 3个分量)JPEG / PNG / TIFF图片。上面的代码很好地提取了RGBA(4个值)缓冲区,但我真正想要的是另一个 API来访问这个原始 RGB (3个像素值) ) 缓冲。在这种情况下,我会:

assert( length == w * h * 3 && nsamples == 3 ); // only RGB

当所有其他方法都失败时,我可以简单地从4个RGBA字节缓冲区中复制3个RGB字节,但这感觉很难看。

1 个答案:

答案 0 :(得分:2)

您使用的框架不支持24bpp图像数据。这是"某些情况的含义"链接你的问题。

(您可以在Apple https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203-CJBEAGHH的文档中查看此表。

您需要从rawData中提取所需的字节,然后将它们复制到单独的缓冲区中。 (或者改变你的图像处理算法,无论如何,处理32bpp。)