Cocoa 将原始缓冲区绘制到CGBitmapContext

Cocoa 将原始缓冲区绘制到CGBitmapContext,cocoa,Cocoa,我有一个RGB格式的原始图像缓冲区。我需要将其绘制到CGContext,以便获得格式为ARGB的新缓冲区。我通过以下方式实现这一点: 使用CGDataProviderCreateWithData从原始缓冲区创建数据提供程序,然后使用api:CGImageCreate从数据提供程序创建图像 现在,如果我使用CGContextImageDraw将此图像写回CGBitmapContext 有没有办法直接将缓冲区写入CGContext以避免图像创建阶段,而不是创建中间图像 谢谢如果您使用的是CGBitm

我有一个RGB格式的原始图像缓冲区。我需要将其绘制到CGContext,以便获得格式为ARGB的新缓冲区。我通过以下方式实现这一点:

使用
CGDataProviderCreateWithData
从原始缓冲区创建数据提供程序,然后使用api:
CGImageCreate
从数据提供程序创建图像

现在,如果我使用
CGContextImageDraw
将此图像写回CGBitmapContext

有没有办法直接将缓冲区写入CGContext以避免图像创建阶段,而不是创建中间图像


谢谢

如果您使用的是
CGBitmapContext
,则可以使用
CGBitmapContextGetData()
函数获取指向位图缓冲区的指针。然后,您可以将数据直接写入缓冲区。

如果您只想获取不含alpha分量的RGB数据,并将其转换为具有完全不透明度(所有点的alpha=1.0)的ARGB数据,为什么不直接将数据复制到新的缓冲区中呢

// assuming 24-bit RGB (1 byte per color component)
unsigned char *rgb = /* ... */;
size_t rgb_bytes = /* ... */;
const size_t bpp_rgb = 3;  // bytes per pixel - rgb
const size_t bpp_argb = 4;  // bytes per pixel - argb
const size_t npixels = rgb_bytes / bpp_rgb;
unsigned char *argb = malloc(npixels * bpp_argb);
for (size_t i = 0; i < npixels; ++i) {
    const size_t argbi = bpp_argb * i;
    const size_t rgbi = bpp_rgb * i;
    argb[argbi] = 0xFF;  // alpha - full opacity
    argb[argbi + 1] = rgb[rgbi];  // r
    argb[argbi + 2] = rgb[rgbi + 1];  // g
    argb[argbi + 3] = rgb[rgbi + 2];  // b
}
//假设为24位RGB(每个颜色分量1字节)
无符号字符*rgb=/*…*/;
大小(rgb字节)=/*…*/;
常量大小\u t bpp\u rgb=3;//每像素字节数-rgb
常量大小\u t bpp\u argb=4;//每像素字节数-argb
const size\u t npixels=rgb\u字节/bpp\u rgb;
无符号字符*argb=malloc(npixels*bpp_argb);
对于(大小i=0;i
是的,我使用的是CGBitmapContext,但我的要求恰恰相反。我有一个RGB缓冲区,我想把它转换成RGBA/ARGB缓冲区。在这种情况下,我认为你没有太多选择。您需要从RGB数据创建一个
CGImageRef
,然后在ARGB
CGBitmapContext
中绘制它。你不想使用CGImage有什么原因吗?是的,我需要从现有的缓冲区中创建一个新的缓冲区,那么我是否需要创建一个中间CGImage并将其转换回(使用CGBitmapContext)?这是一个很好的建议Jeremy,我已经尝试过了,但结果太慢了。我只是想知道是否有任何有效的方法来实现这一点。似乎唯一可能的方法就是我现在所做的和罗布建议的一样。创建一个映像并将其拉回到上下文。确保在应用了所有编译器优化的情况下,而不是在调试配置下,在发布配置下测试速度。如果它仍然太慢,你可以尝试(按可能的难度顺序):用手展开循环;读写单词而不是字节;使用向量指令;将工作卸载到GPU。