将RAW缓冲区绘制为CGBitmapContext

时间:2010-04-08 05:32:07

标签: cocoa

我有一个RGB格式的原始图像缓冲区。我需要将它绘制到CGContext,以便获得格式为ARGB的新缓冲区。我通过以下方式完成此任务:

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

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

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

谢谢

2 个答案:

答案 0 :(得分:2)

如果您只想拍摄没有alpha分量的RGB数据并将其转换为具有完全不透明度的ARGB数据(所有点都为alpha = 1.0),为什么不将数据自己复制到新缓冲区?

// 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
}

答案 1 :(得分:0)

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