GIFs animées : gérer les couleurs

Comme vous le savez déja, le format GIF ne peut pas utiliser plus de 256 couleurs simultanées. Hélas, la plupart des images modernes, et surtout les photos couleur, contiennent bien plus de couleurs différentes : jusqu'à 16 millions dans l'état actuel de l'art. Nous avons donc un petit souci, bien connu des animagifeurs. Il nous faut réduire drastiquement le nombre des couleurs.


exemple de palette

Cette réduction du nombre de couleurs peut s'appeler la quantification, ou autre chose... Et pour cela, il existe plusieurs techniques. Nous allons rapidement voir l'une d'entre elle, qui utilise une palette de référence et le logiciel ppmquant, dont voici quelques extraites de la manpage.

NAME
 ppmquant - quantize the colors in a portable pixmap down to a
 specified number

SYNOPSIS
       ppmquant [-floyd|-fs] ncolors [ppmfile]
       ppmquant [-floyd|-fs] [-nofloyd|-nofs] -mapfile mapfile [ppmfile]

DESCRIPTION
       Reads a PPM image as input.  Chooses ncolors colors to  best  represent
       the  image,  maps the existing colors to the new ones, and writes a PPM
       image as output.

       The quantization method is Heckbert's "median cut".

       Alternately, you can skip the color-choosing step  by  specifying  your
       own  set of colors with the -mapfile option.  The mapfile is just a ppm
       file; it can be any shape, all that matters is the colors in  it.   For
       instance,  to quantize down to the 8-color IBM TTL color set, you might
       use:
           P3
           8 1
           255
             0   0   0
           255   0   0
             0 255   0
             0   0 255
           255 255   0
           255   0 255
             0 255 255
           255 255 255

REFERENCES
       "Color Image Quantization for Frame Buffer Display" by  Paul  Heckbert,
       SIGGRAPH '82 Proceedings, page 297.

Il est clair que tout cela semble un peu abscon, mais pas d'inquiétude à avoir, c'est bien plus simple que ça n'en a l'air. Si nous reprenons l'extrait de la page de man, nous pouvons rapidement voir à quoi ça nous mène. Hop, un petit script :

#!/bin/bash

source functions_gif.bash

cat > 8cols.ppm << __EOM__
P3
8 1
255
  0   0   0
255   0   0
  0 255   0
  0   0 255
255 255   0
255   0 255
  0 255 255
255 255 255
__EOM__

postprocess3 exemple_rgb.png 8colors.gif 8cols.ppm

Et voici le résultat. Pas besoin de beaucoup de couleurs pour faire une image lisible.


true colors

height colors

Vous pouvez maintenant sereinement imaginer dans votre tête les potentialités offertes par le choix opportun et réfléchi d'une palette adaptée.

D'accord, mais alors, quelle est la recette magique pour obtenir cette fameuse palette adaptée ? Le programme pnmcolormap est peut-être la bonne réponse. En tout cas, la manpage est prometteuse, et les essais commenceront juste après la sieste.

pngtopnm $IMG | pnmcolormap 126 > $MAP
convert $MAP -filter point -resize '400%x2400%' foo.png
display foo.png &
postprocess3 $IMG ncolors.gif $MAP
display ncolors.gif