Cómo convertir 256 colores Paletizados Datos de imagen RGBA a NSIMAGE
-
27-10-2019 - |
Pregunta
Soy un desarrollador novato y necesito tu ayuda con algo que probablemente sea trivial para ti.
Tengo datos de imagen en este formato de píxel: 256 colores paletizados RGBA. Viene de ffmpeg (PIX_FMT_PAL8)
Y se explica de esta manera:
PIX_FMT_RGB32 se maneja de una manera específica de Endian. Se junta un color RGBA como:
(A << 24) | (R << 16) | (G << 8) | B
Esto se almacena como BGRA en arquitecturas de CPU de Little Endian y Argb en las CPU grandes endian.
Cuando el formato de píxel se paleta RGB (PIX_FMT_PAL8), los datos de imagen paletizados se almacenan en avframe.data [0].
La paleta se transporta en avframe.data [1], tiene 1024 bytes de largo (256 entradas de 4 bytes) y se formatean igual que en PIX_FMT_RGB32 descrito anteriormente (es decir, también es específico de Endian). Tenga en cuenta también que los componentes individuales de la paleta RGB almacenados en avframe.data [1] deben estar en el rango 0..255.
Avframe struct contiene uint8_t *data[4]
y int linesize[4]
y se describen simplemente con:
uint8_t *data[4]
= puntero a los planos de imagen- Se dan cuatro componentes, eso es todo.
- El último componente es alfa
int linesize[4]
= número de bytes por línea
Tengo la estructura Avframe con todos los datos necesarios, pero no sé cómo manejarlos. Necesito crear una imagen a partir de los datos de esta imagen.
¿Cómo puedo hacer esto?
Solución
En el caso de una imagen paletizada, los píxeles contienen un valor de un byte, que es un índice en la paleta. La paleta tiene 256 entradas.
Los píxeles se almacenan comenzando en la dirección avframe.data [0]; La paleta se almacena comenzando en la dirección avframe.data [1].
Entonces, para obtener el valor de 4 bytes píxeles para el píxel en (x, y), puede usar primero:
uint8_t Index= AVFrame.data[0][X + AVFrame.linesize[0] * Y];
para obtener el índice en la paleta, y luego
int RGBA= ((int*)AVFrame.data[1])[Index];
Para obtener el valor codificado RGBA.