Comment convertir 256 couleurs palettisée données d'image RGBA à NSImage
-
27-10-2019 - |
Question
Je suis un développeur débutant et j'ai besoin de votre aide avec quelque chose qui est probablement trivial pour vous.
J'ai données d'image dans ce format de pixel: 256 couleurs RGBA palettisée. Il vient de (PIX_FMT_PAL8)
FFmpeg et il est expliqué ainsi:
PIX_FMT_RGB32 est traitée d'une manière spécifique à endian. un RGBA la couleur est mis en place comme:
(A << 24) | (R << 16) | (G << 8) | B
est stocké sous forme BGRA sur des architectures CPU little-endian et ARVB sur les processeurs grand-boutiste.
Lorsque le format de pixel est palettisée RGB (PIX_FMT_PAL8), les données d'image sont stockées dans palettisée AVFrame.data [0].
La palette est transportée dans AVFrame.data [1], est de 1024 octets de long (256 entrées 4 octets) et est mis en forme le même que dans PIX_FMT_RGB32 décrit ci-dessus (à savoir, il est également endian spécifique). Notez également que les différents composants de la palette RVB stockées dans AVFrame.data [1] doit être comprise entre 0..255.
AVFrame struct contient uint8_t *data[4]
et int linesize[4]
et ils sont décrits simplement avec:
uint8_t *data[4]
= pointeur vers les plans d'image- quatre composantes sont données, c'est tout.
- le dernier composant est alpha
int linesize[4]
= nombre d'octets par ligne
Je struct AVFrame avec toutes les données nécessaires, mais je ne sais pas comment le gérer. Je dois créer un NSImage à partir de ces données d'image.
Comment puis-je faire?
La solution
In case of a palettized image, the pixels contain a one byte value, which is an index into the palette. The palette has 256 entries.
Pixels are stored starting at address AVFrame.data[0]; the palette is stored starting at address AVFrame.data[1].
So to get the 4 bytes pixel value for the pixel at (X, Y), you can use first:
uint8_t Index= AVFrame.data[0][X + AVFrame.linesize[0] * Y];
to get the index into the palette, and then
int RGBA= ((int*)AVFrame.data[1])[Index];
to get the RGBA encoded value.