【发布时间】:2015-04-30 08:16:06
【问题描述】:
我试图让指针直接访问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 字节,但这感觉很难看。
【问题讨论】:
-
如果我误解了,请纠正我,你想把你的图像变成位图吗?
标签: objective-c cgimage