从 CGImageRef 获取原始 RGB 缓冲区

Getting the raw RGB buffer from an CGImageRef

我正在尝试直接访问 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 个值)缓冲区,但我真正要搜索的是 another API 以访问此原始 RGB(3 个像素值)缓冲区。在这种情况下我会:

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

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

您使用的框架不支持 24bpp 图像数据。这就是你问题中 "some circumstances" link 的含义。

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

您需要从 rawData 中提取所需的字节并将它们复制到单独的缓冲区中。 (或者改变你的图像处理算法,不管是什么,来处理 32bpp。)