Comment convertir 16 bits RGB565 à 24 bits RGB888?

J'ai eu mes mains sur 16 bits rgb565 image (plus précisément, un Android framebuffer dump), et je voudrais le convertir en 24 bits rgb888 pour l'affichage sur un moniteur normal.

La question est, comment convertir 5 ou 6 bits de canal à 8 bits? La réponse est évidente pour le déplacer. J'ai commencé par écrit ceci:

puts("P6 320 480 255");
uint16_t buf;
while (read(0, &buf, sizeof buf)) {
    unsigned char red = (buf & 0xf800) >> 11;
    unsigned char green = (buf & 0x07e0) >> 5;
    unsigned char blue = buf & 0x001f;
    putchar(red << 3);
    putchar(green << 2);
    putchar(blue << 3);
}

Cependant, ce n'est pas une propriété que je voudrais, ce qui est pour 0xffff à la carte de 0xffffff, au lieu de 0xf8fcf8. J'ai besoin d'accroître la valeur d'une certaine façon, mais je ne suis pas sûr de savoir comment cela devrait fonctionner.

Le SDK Android est livré avec un outil appelé ddms (Dalvik Debug Monitor) qui prend des captures d'écran. Aussi loin que je peux dire de la lecture du code, il met en œuvre la même logique; mais sa captures d'écran viennent de sortir différents, et le blanc est la cartographie de blanc.

Voici la raw framebuffer, le conversion intelligente par ddms, et la la conversion idiote par l'algorithme ci-dessus. A noter que ce dernier est légèrement plus foncée et plus écologique.

(En passant, cette conversion est mis en œuvre dans ffmpeg, mais il est juste d'effectuer la conversion idiote énumérés ci-dessus, laissant le Lsb à tous les zéro.)

Je suppose que j'ai deux questions:

  • Ce qui est la façon la plus sensée pour convertir rgb565 à rgb888?
  • Comment est DDMS à la conversion de ses captures d'écran?
InformationsquelleAutor Josh Lee | 2010-03-14