Je bosse donc sur des eBook, qui nécessitent un affichage en 8 niveaux de gris (sur 3bits, donc). Afin de s'assurer que toutes les images soient "conformes" et qu'on ait appliqué un beau dithering dessus, la fonction Normalize a été créée. Sa sortie est donc naturellement une image en 8 niveaux de gris, avec dithering.

Quelle est la méthode la plus simple pour obtenir un image en 8 niveaux de gris ? Prendre une image vierge 3bits, prendre une image en 256 niveaux de gris, et générer dans l'image vierge la nouvelle image à rendre. Or, cette fonction prend en entrée une image en truecolor, mais où toutes les couleurs sont grises...

Il faut donc qu'on ait une routine qui transforme toute image en image truecolor avec niveaux de gris. C'est le rôle de la fonction "Grayscale".

Voyons maintenant ce qui se passe quand une des libs qu'on utilise nous file une image à afficher... Notons que cette lib nous donne un buffer en 8bit (256 niveaux de gris, donc...). On normalise l'image, donc on obtient, dans l'ordre :

  • Une première image en niveaux de gris, en vrai 8bit (créée à partir du buffer)
  • Une deuxième image en truecolor, mais où tous les pixels sont en niveaux de gris
  • Une troisième image en niveaux de gris, en vrai 8bit
  • Une quatrième image en 3bit avec dithering (ah, enfin !)

Est-ce qu'il n'y a pas quelque chose qui vous dérange, là ? ^^ (ça vous surprendra peut-être, mais en faisant une routine de normalisation qui prend en entrée un buffer 8bit et sort l'image 3bit, le rendu se fait 2 fois plus vite...)

(inutile de préciser que l'essentiel du code venait de Taiwan ;) )