Comment optimiser les images jpeg/png avec jpegtran et pngquant sur Linux

Compression et optimisation des images

L’optimisation des images sur un site est souvent oubliée. Pourtant nous recherchons tous à charger le plus rapidement nos sites pour éviter que nos visiteurs attentent ou même pire aillent voir ailleurs. Pour réduire le temps de chargement de vos pages et nottement de vos ressources externes il faut compresser les images qui accompagnent nos articles ou illustrent votre site.
Je vais donc vous présenter deux outils jpegtran et pngquant qui permettent d’optimisez vos images jpeg et png sans perdre de qualité.

Optimisation des jpeg avec jpegtran

Installer jpegtran

sudo apt-get install libjpeg-turbo-progs

Lancement

jpegtran -copy none -optimize -perfect -outfile dest_file.jpg source_file.jpg

Explication des options

  • -copy none : Indique qu’il faut ne faut pas copier tous les commentaires et autres markers présent dans l’image source
  • -optimize : Effectue l’optimisation des paramètres d’encodage
  • -perfect : Demande une transformation parfaite. Si la transformation n’est pas parfaite alors jpegtran échoue avec une erreur
  • -outfile : Indique dans quel fichier l’image transformer sera générée. Il est possible de donner le nom que la source, ainsi le fichier sera remplacé

Il propose également d’autres fonctionnalités comme :

  • Créer une image progressive
  • Appliquer une rotation à l’image
  • Appliquer un effet miroir
  • Appliquer un nieau de gris

 

Optimisation des png avec pngquant

Il y a différents outils pour optimiser vos PNG à savoir pngquant / optipng / pngcrush / pngnq. J’ai pris ma décision en me basant sur ce benchmark. Ainsi que sur une présentation que Kernel Lesiński a fait durant le Sud Web de 2015 auquel j’ai assisté. Kernet est le développeur de pngquant. Vous trouverez sa présentation en anglais sur vimeo The story behind lossy PNG compression

Installer pngquant

sudo apt-get install pngquant

Lancement

pngquant -f --ext .png --quality=70-95 --skip-if-larger source_file.jpg

Explication des options

  • -f –ext .png: Ecrase le fichier source en gardant le même nom
  • –ext .png : Extension à utiliser pour le fichier de sortie à la place
  • –quality min-max : min et max sont des entiers compris entre 0 (worst) et 100 (perfect). pngquant va utliser le moins de couleurs necéssaires pour atteindre ou dépasser la qualité max définie. Si le résultat de la conversion est inférieure ç la qualité min définie alors l’image ne sera pas gardée
  • -skip-if-larger : Si la conversion créée un fichier de taille supérieure à la source alors le fichier généré ne sera pas conservé

Optimiser toutes les images d’un dossier

Le but est d’optimiser vos images d’un coup sans avoir à les traiter une par une. Et tant qu’à faire les choses bien, autant créer un cron qui va tous les jours optimiser vos nouvelles images uploadées.

Tout d’abord on va lancer l’optimisation sur toutes vos images présentes dans un dossier :

find /folder -type f -iname '*.jpg' -exec jpegtran -copy none -optimize -perfect -outfile {} {} \;
find /older -type f -iname '*.png' -exec pngquant -f --ext .png  --quality=70-95 --skip-if-larger {} \;

Le but est de rechercher tous les fichiers avec pour extensions soit jpg soit png. Puis d’envoyer la liste à soit jpegtran soit pngquant.

Maintenant il vous reste plus qu’à créer un script  avec le contenu suivant, en remplaçant le dossier folder par celui qui contient vos images.

#! /bin/bash

referenceFile='/var/tmp/optimise-image.log'

if [ ! $referenceFile ]
then
    touch /var/tmp/optimise-image.log -d 1970101
fi

find /folder -type f -iname '*.jpg' -mtime -1 -newer $referenceFile -exec jpegtran -copy none -optimize -perfect -outfile {} {} \;

find /folder -type f -iname '*.png' -mtime -1 -newer $referenceFile -exec pngquant -f --ext .png  --quality=70-95 --skip-if-larger {} \;

touch $referenceFile

Puis de rajouter l’appel à ce script dans le cron (/etc/crontab):

0 4 * * * root /bin/bash /home/exploit/Script/optimize-image.sh

L’option -mtime -1 permet de ne remonter que les nouvelles images créés à J-1, soit les nouvelles images de moins de 24h.

L’option -newer permet d’exclure les fichiers créés avant la date de modification du fichier donné en paramètre. Elle fait un peu doublon avec le -mtime -1 .
Si je n’avais pas mis cette dernière option, le find aurait remonté tous les jours les mêmes fichiers puisque le script tourne toujours à la même heure et le -mtime -1 indique inférieure ou égale à 24h. Il fallait donc trouver un moyen d’exclure les fichiers qui avaient été modifié la vieille.