4

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

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

PIX_FMT_RGB32 以特定于字节序的方式处理。RGBA 颜色组合为:

(A << 24) | (R << 16) | (G << 8) | 乙

这在小端 CPU 架构上存储为 BGRA,在大端 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]andint linesize[4]并且它们被简单地描述为:

  • uint8_t *data[4]= 指向图片平面的指针
  • 给出了四个组件,仅此而已。
  • 最后一个组件是 alpha
  • int linesize[4]= 每行的字节数

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

我怎样才能做到这一点?

4

1 回答 1

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 编码值。

于 2012-02-20T09:54:28.570 回答