objective-c – 从CGImageRef获取原始RGB缓冲区

我试图让指针直接访问CG
ImageRef的底层RGB缓冲区.我的第一次尝试如下:

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

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

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字节,但这感觉很难看.

最佳答案 您使用的框架不支持24bpp图像数据.这就是你问题中“某些情况”链接的含义.

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

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

点赞