Как преобразовать 256 цветов палитрированных данных изображения RGBA в NSImage

StackOverflow https://stackoverflow.com/questions/7335504

Вопрос

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

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

Pix_fmt_rgb32 обрабатывается эндсианским образом. Цвет RGBA составлен как:

(A << 24) | (R << 16) | (G << 8) | Беременный

Это хранится как BGRA на архитектурах процессоров и ARGB в Little-Endian на процессорах Big-Endian.

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

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

Avframe Struct содержит uint8_t *data[4] а также int linesize[4] и они описаны просто с:

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top