我有一个RGB格式的原始图像缓冲区。我需要将它绘制到CGContext,以便获得格式为ARGB的新缓冲区。我通过以下方式完成此任务:
使用CGDataProviderCreateWithData
从原始缓冲区创建数据提供程序,然后使用api:CGImageCreate
从数据提供程序创建映像。
现在,如果我使用CGContextImageDraw
将此图像写回CGBitmapContext。
有没有办法将缓冲区直接写入CGContext,以便我可以避免图像创建阶段,而不是创建中间图像?
谢谢
答案 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()
函数获取指向位图缓冲区的指针。然后,您可以将数据直接写入缓冲区。