如何将256色调的RGBA图像数据转换为NSImage

时间:2011-09-07 14:22:27

标签: image nsimage palette rgba nsbitmapimagerep

我是新手开发者,我需要你的帮助,这对你来说可能是微不足道的。

我有这种像素格式的图像数据:256色调的RGBA。它来自FFmpeg (PIX_FMT_PAL8),它以这种方式解释:

  

PIX_FMT_RGB32以特定于endian的方式处理。一个RGBA   颜色组合在一起:

     

(A <&lt; 24)| (R&lt;&lt; 16)| (G <&lt; 8)|乙

     

在小端CPU架构上存储为BGRA,在big-endian CPU上存储为ARGB。

     

当像素格式是调色RGB(PIX_FMT_PAL8)时,调色图像数据存储在AVFrame.data [0]中。

     

调色板在AVFrame.data [1]中传输,长度为1024字节(256个4字节条目),其格式与上述PIX_FMT_RGB32相同(即,它也是字节序特定的)。另请注意,存储在AVFrame.data [1]中的各个RGB调色板组件应在0..255范围内。

AVFrame结构包含uint8_t *data[4]int linesize[4],它们仅用以下内容描述:

  
      
  • uint8_t *data[4] =指向图片平面的指针
  •   
  • 给出了四个组成部分,这就是全部。
  •   
  • 最后一个组件是alpha
  •   
  • int linesize[4] =每行的字节数
  •   

我有AVFrame结构,包含所有需要的数据,但我不知道如何处理它。 我需要从这个图像数据创建一个NSImage。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

在调色图像的情况下,像素包含一个字节值,该值是调色板的索引。调色板有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];

获取RGBA编码值。