Skip to main content

Optimiser ses images avec le «Dithering»

Afin de diminuer au maximum le poid de ces images, le site de [LOW←TECH MAGAZINE] à mit en place une ancienne technique de compression d’image appelée « diffusion d’erreur ».

Cette technique repose sur deux grand principes :

La «quantification des couleurs»

Une image habituel est composé de pixel pouvant avoir nimporte quel couleur codé sur trois canneaux : Rouge, Vert, Bleu, avec pour chaque une valeur allant de 0 à 255.

L’indexation d’image est une technique qui consiste à réduire les couleurs de l’image à une palette réduite.

Cette technique, aussi nommée «Color Quantization» économise beaucoup de poid, mais laisse place à moins de nuances.

L’équipe de [LOW←TECH MAGAZINE] a fait le choix d’utilier 4 nuances de gris, et d’y appliquer un filtre CSS pour remplacer le blanc par une couleur : mix-blend-mode: hard-light;

Par contre, si on se contente d’indexer les couleurs d’une image dans Gimp ou Photoshop, le rendu visuel ne sera pas forcément optimal, surtout en monochrome.

Le «trammage»

Pour améliorer la visibilité de l’image avec le moins de couleurs possibles, une bonne astuce est d’utiliser des trames «dithering».

Vu a une certaines distance, la quantité de noir et de blanc se mélangent et sont percu comme un gris.

Il existe plusieurs algorythme de dithering, imagemagick permet entre autre d’en appliquer en ligne de commande.


R&D de compression

J’ai voulu expérimenter différentes options d’imagemagick pour comparer les résultat tant visuelment que sur le poid du fichier final.

  • Je suis partis de cette image source.
  • Le poid des images s’affichent au survol.

Quantification des couleurs

# Resize & 2 grey : 19KB
convert gare.jpg -resize 400x600 -colors 2 -colorspace gray -normalize gare1.gif

# Resize & 3 grey : 24KB
convert gare.jpg -resize 400x600 -colors 3 -colorspace gray -normalize gare2.gif

# Resize & 3 colors : 25KB
convert gare.jpg -resize 400x600 -colors 3 -normalize gare3.gif

# Resize & 4 colors : 30KB
convert gare.jpg -resize 400x600 -colors 4 -normalize gare4.gif

gare1.gif gare2.gif

gare3.gif gare4.gif


Trammage en noir et blanc

# Resize & Ordered Dither 2 : 8KB
convert gare.jpg -resize 400x600 -colorspace gray -ordered-dither o2x2 gare5.gif

# Resize & Ordered Dither 3 : 10KB
convert gare.jpg -resize 400x600 -colorspace gray -ordered-dither o3x3 gare6.gif

# Resize & Ordered Dither 4 : 11KB
convert gare.jpg -resize 400x600 -colorspace gray -ordered-dither o4x4 gare7.gif

# Resize & Ordered Dither 8 : 12KB
convert gare.jpg -resize 400x600 -colorspace gray -ordered-dither o8x8 gare8.gif

gare5.gif gare6.gif

gare7.gif gare8.gif


Trammage en couleurs

# Resize & Ordered Dither 2 : 20KB
convert gare.jpg -resize 400x600 -ordered-dither o2x2 gare9.gif

# Resize & Ordered Dither 3 : 23KB
convert gare.jpg -resize 400x600 -ordered-dither o3x3 gare10.gif

# Resize & Ordered Dither 4 : 25KB
convert gare.jpg -resize 400x600 -ordered-dither o4x4 gare11.gif

# Resize & Ordered Dither 8 : 27KB
convert gare.jpg -resize 400x600 -ordered-dither o8x8 gare12.gif

gare9.gif gare10.gif

gare11.gif gare12.gif


Comparaison

Les trammages en noir et blanc donnent les meilleur compression :

  • Ordered Dither 2 : 8KB Pas assez de détails
  • Ordered Dither 3 : 10KB Beaucoup mieux
  • Ordered Dither 4 : 11KB Très bon comprimit
  • Ordered Dither 8 : 12KB Les trames commencent à être trop visible

Suivi par :

  • La quantification en 2 couleurs : 19KB pas du tout détaillée.
  • Le trammage coloré Ordered Dither 2 : 20KB même niveau de détail.

Les autres vont de 23KB à 30KB ce qui commence à faire beaucoup comparé au 10KB totalement correcte que l’on a eu précédement.

Le meilleur compromit taille et esthétique se place donc entre :

  • Ordered Dither 3 10KB qui fait des trames en forme de taches
  • Ordered Dither 4 11KB qui fait des trames en forme de croix

Je vais décliner ces réglages avec différentes images sources pour avoir un avis plus avisé.

Sources : gare.jpg ; matcha.jpg ; bike.jpg ; desktop.jpg ;

Déclinaison

gare6.gif gare7.gif

10KB & 11KB

matcha3.gif matcha4.gif

4KB & 4KB

bike3.gif bike4.gif

13KB & 16KB

desktop3.gif desktop4.gif

10KB & 11KB

Conclusion

On constate que dans certains cas, le «Ordered Dither 3» manque de détail. Je préconise donc «Ordered Dither 4» :

convert input.jpg -resize 400x600 -colorspace gray -ordered-dither o4x4 output.gif