【问题标题】:Getting the raw RGB buffer from an CGImageRef从 CGImageRef 获取原始 RGB 缓冲区
【发布时间】: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


【解决方案1】:

您使用的框架不支持 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。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2013-02-19
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多