in mozjpeg jpeg encoder jpegtran images script ~ de lecture.

Mozjpeg, un compresseur d'images qui vaut le détour

Il existe de nombreux outils d'optimisation d'images (jpegtran, jpegoptim ...), certains de qualité, d'autres non, celui utilisé ci-après est celui soutenu par la fondation Mozilla, mozjpeg, dont la version 3.2 est sortie en juillet 2017.

Mozjpeg est un encodeur JPEG qui permet de diminuer la taille des images (son poids) sans modifier la qualité perçue : une image encodée avec cet outil est parfaitement lisible par n'importe quel logiciel capable de lire du JPEG.

Selon Mozilla, mozjpeg permet en moyenne de diminuer de 5 % la taille des images JPEG.

mozjpeg-kompression

Pré-requis

$ sudo apt-get -y install build-essential cmake libtool autoconf automake m4 nasm yasm pkg-config

Installation

L'installation ci-dessous concerne les utilisateurs d'une distribution Linux, il faut d'abord télécharger les sources puis exécuter les commandes suivantes :

$ wget https://github.com/mozilla/mozjpeg/releases/download/v3.2/mozjpeg-3.2-release-source.tar.gz -O mozjpeg.tar.gz
tar -xf mozjpeg.tar.gz
cd mozjpeg
autoreconf -fiv
mkdir build && cd build
sh ../configure
sudo make install

L'outil est installé par défaut dans le répertoire '/opt/mozjpeg', pour simplifier son usage je vous invite à créer un lien symbolique 'mozjpeg' comme ceci :

$ sudo ln -s /opt/mozjpeg/bin/jpegtran /usr/local/bin/mozjpeg

Utilisation

Pour tester la compression sur une image en particulier, voici un exemple de commande à exécuter :

$ mozjpeg -copy none image.jpg > compressed.jpg

Pour les plus curieux, voici l'ensemble des paramètres attendus par l'outil :

usage: mozjpeg [switches] [inputfile]
Switches (names may be abbreviated):
  -copy none     Copy no extra markers from source file
  -copy comments Copy only comment markers (default)
  -copy all      Copy all extra markers
  -optimize      Optimize Huffman table (smaller file, but slow compression, enabled by default)
  -progressive   Create progressive JPEG file (enabled by default)
  -revert        Revert to standard defaults (instead of mozjpeg defaults)
  -fastcrush     Disable progressive scan optimization
Switches for modifying the image:
  -crop WxH+X+Y  Crop to a rectangular subarea
  -grayscale     Reduce to grayscale (omit color data)
  -flip [horizontal|vertical]  Mirror image (left-right or top-bottom)
  -perfect       Fail if there is non-transformable edge blocks
  -rotate [90|180|270]         Rotate image (degrees clockwise)
  -transpose     Transpose image
  -transverse    Transverse transpose image
  -trim          Drop non-transformable edge blocks
Switches for advanced users:
  -arithmetic    Use arithmetic coding
  -restart N     Set restart interval in rows, or in blocks with B
  -maxmemory N   Maximum memory to use (in kbytes)
  -outfile name  Specify name for output file
  -verbose  or  -debug   Emit debug output
  -version       Print version information and exit
Switches for wizards:
  -scans file    Create multi-scan JPEG per script file

Pour une utilisation de masse et de façon récursive, voici la commande utilisée qui m'a permis de parcourir mes dizaines de répertoires totalisant 65697 fichiers images JPEG :

$ find /mon_repertoire_images -name '*.jpg' -type f -exec sh -c 'mozjpeg -copy none -outfile "$@" "$@";' sh {} \;

Résultats

Après exécution du script, le poids de mes images est passé de 1885 Mo à 1772 Mo, soit un gain de 6%, sans perte, efficace, j'adore.

Je suis passé d'une note B à une note A dans la catégorie "Optimize images" des sites de test de performance, notamment GTmetrix.

optimize_images_before

optimize_images_after

Comparaison d'outils

https://blarg.co.uk/blog/comparison-of-jpeg-lossless-compression-tools