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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top