我是一个新手开发人员,我需要你的帮助与一些可能是微不足道的你。
我有一个图像数据在这个像素格式:256色调色板RGBA。它来自FFmpeg (PIX_FMT_PAL8)
,解释如下:
PIX_FMT_RGB32以尾端特定的方式处理。一个RGBA颜色组合成:
(& lt; & lt;24) | (R <<16) | (G <<8) | B
在小端CPU架构上存储为BGRA,在大端CPU架构上存储为ARGB。
当像素格式为RGB (PIX_FMT_PAL8)时,调色板图像数据存储在AVFrame.data[0]中。
调色板在AVFrame中传输。data[1],长度为1024字节(256个4字节条目),格式与上面描述的PIX_FMT_RGB32相同(也就是说,它也是特定于端部的)。还要注意,单个RGB调色板组件存储在AVFrame中。数据[1]的取值范围应为0 ~ 255。
AVFrame结构体包含uint8_t *data[4]
和int linesize[4]
,它们被简单地描述为:
uint8_t *data[4]
=指向图片平面的指针- 给出了四个组件,仅此而已。
- 最后一个分量是alpha
int linesize[4]
=每行字节数
我有AVFrame结构与所有需要的数据,但我不知道如何处理它。我需要从这个图像数据中创建一个NSImage。
我该怎么做?
对于调色板图像,像素包含一个一个字节的值,这是调色板的索引。这个调色板有256个条目。
像素从地址AVFrame.data[0]开始存储;调色板从地址AVFrame.data[1]开始存储。
所以要获得像素在(X, Y)处的4字节像素值,你可以先使用:
uint8_t Index= AVFrame.data[0][X + AVFrame.linesize[0] * Y];
将索引放入调色板,然后
int RGBA= ((int*)AVFrame.data[1])[Index];