gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:39 24 4
gpt4 key购买 nike

我正在尝试直接访问 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 字节,但这感觉很难看。

最佳答案

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

关于objective-c - 从 CGImageRef 获取原始 RGB 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29962488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com