Как преобразовать данные изображения RGBA с 256 цветами в NSImage - PullRequest
4 голосов
/ 07 сентября 2011

Я начинающий разработчик, и мне нужна ваша помощь с чем-то, что, вероятно, тривиально для вас.

У меня есть данные изображения в этом пиксельном формате: 256 цветов RGBA. Это происходит от FFmpeg (PIX_FMT_PAL8) и объясняется так:

PIX_FMT_RGB32 обрабатывается в порядке, обратном порядку байтов. RGBA цвет складывается как:

(А << 24) | (R << 16) | (G << 8) | B </p>

Он хранится в виде BGRA на архитектурах с прямым порядком байтов и ARGB на процессорах с прямым порядком байтов.

Когда формат пикселя имеет палитру RGB (PIX_FMT_PAL8), данные палитрированного изображения сохраняются в файле AVFrame.data [0].

Палитра транспортируется в AVFrame.data [1], имеет длину 1024 байта (256 4-байтовых записей) и форматируется так же, как в PIX_FMT_RGB32, описанном выше (то есть она также специфична для байтов) Также обратите внимание, что отдельные компоненты палитры RGB, хранящиеся в файле AVFrame.data [1], должны находиться в диапазоне 0..255.

Структура AVFrame содержит uint8_t *data[4] и int linesize[4], и они описываются просто с помощью:

  • uint8_t *data[4] = указатель на плоскость изображения
  • даны четыре компонента, вот и все.
  • последний компонент альфа
  • int linesize[4] = количество байтов в строке

У меня есть структура AVFrame со всеми необходимыми данными, но я не знаю, как с этим справиться. Мне нужно создать NSImage из этих данных изображения.

Как я могу это сделать?

1 Ответ

1 голос
/ 20 февраля 2012

В случае изображения с палитрой пиксели содержат однобайтовое значение, которое является указателем в палитре.Палитра содержит 256 записей.

Пиксели сохраняются, начиная с адреса AVFrame.data [0];палитра сохраняется начиная с адреса AVFrame.data [1].

Таким образом, чтобы получить 4-байтовое значение пикселя для пикселя в точке (X, Y), сначала можно использовать:

uint8_t Index= AVFrame.data[0][X + AVFrame.linesize[0] * Y];

, чтобы получить индекс в палитре, а затем

int RGBA= ((int*)AVFrame.data[1])[Index];

, чтобы получить кодированное значение RGBA.

...