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.

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
https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare1.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare2.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare3.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-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
https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare5.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare6.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare7.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-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
https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare9.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare10.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare11.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare12.gif

Comparaison

Les trammages en noir et blanc donnent les meilleur compression :

Suivi par :

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 :

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

https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare6.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-gare7.gif

10KB & 11KB

https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-matcha3.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-matcha4.gif

4KB & 4KB

https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-bike3.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-bike4.gif

13KB & 16KB

https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-desktop3.gif https://wiki.kher.nl/uploads/images/gallery/2020-05/lyyJ2Y6NVIyyp4on-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