Как преобразовать 256 цветов палитрированных данных изображения RGBA в NSImage
-
27-10-2019 - |
Вопрос
Я новичок в разработчике, и мне нужна ваша помощь с чем -то, что, вероятно, для вас тривиально.
У меня есть данные изображения в этом формате пикселей: 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.