Besoin : redimensionner un lot d'images pour réduire leur taille et augmenter leur taux de compression afin d'économiser de la place sur le disque dur.

En effet, les appareils photos  et aussi les smartphones retournent souvent des images avec des millions de pixels qui font donc une taille sur le disque de plusieurs méga-octets alors que la plupart de ces images ne méritent souvent pas plus de quelques centaines de ko. Il est assez aisé d'obtenir un gain d'environ 10x, et sur des centaines voir des milliers d'images, ça peut permettre un gain significatif de place sur le disque dur.

Si ces images sont sur un serveur web, cela permet, outre le gain de mémoire, un chargement des images plus rapide.

Dans la continuité de mon article (tutoriel) sur le renommage des photos par lot, voici comment réaliser ce redimensionnement en ligne de commande, donc possible sur un serveur ne disposant pas d'interface graphique :

J'utilise pour cela l'incontournable ImageMagick qui contient différentes commandes :

pour commencer vous pouvez en savoir plus sur votre(vos) image(s) avec la commande identify

identify -verbose *.jpg

sans -verbose, vous ne récupérerez guère que les dimensions de l'image, la taille du fichier... ce qui peut suffire

ensuite, si vous n'avez pas besoin de conserver les images originales, on peut utiliser la commande mogrify (soyez prudent, faites des essais avant de traiter votre lot d'images)

Taille de l'image

Lors de la visualisation des images, que ce soit avec eog ou gimp, il est facile de voir le pourcentage. Ainsi, si on voit qu'au delà des 50%, 60%, 70%, l'image manque de piqué, on peut relever ce pourcentage limite et préciser le redimensionnement à partir de ce pourcentage, exemple réel sur des images de smartphone de taille initiale de plus de 5'000 × 4'000 qui ne mérite pas de conserver toute la résolution au vue du faible piqué. J'ai donc redimensionné à 50% (et même 25% pour des images en intérieur avec peu de luminosité donc avec une résolution déplorable en raison du gain-AGC) :

mogrify -resize 50% -verbose -quality 70 IMG_*.jpg

 les images qui en résultent font encore plus de 2'000 pixels de côté et font une taille entre 200 et 500ko, ce qui est très bien pour les partager sur un cloud.

On peut aussi préciser la taille en nombre total de pixels comme illustré ci-dessous :

mogrify -resize 1920000@ -quality 65 *.jpg

-resize 1920000@ va redimensionner l'image à 2,4 millons de pixels en conservant les proportions. Pour des images au format paysage, cela donne environ 1600x1200 pixels ce qui est souvent amplement suffisant pour la visualisation d'images de bonne qualité. Voici ci-dessous un tableau des équivalents pour les images au format 4/3.

taille de l'image taille globale de l'image en pixels remarques
4160×2336 9'717'760

pas du 4/3… format de smartphone, inutile pour visu sur écran et tirage normale, abérrant pour des capteurs de smartphone (sauf très haut de gamme), le seul intérêt est de pouvoir zoomer/recadrer… encore faut-il avoir un piqué (résolution) d'image correcte!

3216×2136 6'869'376 un bon compromis entre taille et résolution pour la conservation d'image de qualité (réflex, APN et smartphone haut de gamme)
2048×1536 3'145'728 suffisant pour des photos qui ne sont pas exceptionnelles
 1800×1350  2'430'000 taille grande mais appréciable pour visu sur les écrans 16/9 actuels
 1600×1200  1'920'000  
1280×1024 1'310'720  
1024×768 786'432  
640×480 307'200 pour mettre dans un exposé en ~½ largeur de page (et éviter que ça "rame" et que le fichier final soit trop gros)


ATTENTION : s'il y a de petites images dans le lot, elles seront agrandies pour approcher la taille définie ! Pour éviter cela, on peut utiliser le 'flag' > :

mogrify -resize 6869376@\> -quality 65 *.jpg

Qualité - taux de compression JPEG

-quality 65 spécifie le pourcentage de compression jpeg :

valeur(s) de qualité remarques
65% donne un bon compromis qualité/efficacité de compression pour le web ou conservation d'images "moyennes"
70-75% pour des images correctes
80-90% si vous prévoyez d'en réaliser des tirages. On peut évidemment faire un mogrify -quality 80 *.JPG pour juste compresser, ce qui peut suffire à passer de plusieurs Mo à moins de un Mo !

plus on approche de 0% et moins la qualité est bonne car la compression est forte, et inversement, plus on approche de 100% et plus la qualité est grande et moins la compression est importante

Si vous souhaitez conserver vos originaux, vous pouvez renommer les images en les redimensionnant en utilisant la commande convert

convert *.jpg -resize 1200000@ -quality 65 -set filename:fname 'prefixe%t' +adjoin repertoire_existant/'%[filename:fname].jpg'

 Quelques liens :

http://www.tux-planet.fr/imagemagick-manipuler-des-images-en-ligne-de-commande/

http://barthes.enssib.fr/cours/photo/ par Eric Guichard

mogrify sur un ensemble de sous-répertoire :

Vous avez accumulé des années ou des mois de photos dans une arborescence.

Se positionner sur le répertoire parents qui contient les répertoires et sous-répertoires à traiter, puis lancer la commande :

find -iname *.jpg -exec mogrify -resize 3145728@\> -quality 70 -verbose {} \;

mogrify avec des expressions régulières (regex) :

Si vous regroupez des images de différentes personnes par exemple et que vous avez déjà traité les premiers lots, il peut-être utile de ne traiter que les nouvelles images... souvent les noms, notamment les préfixes suffisent à le différencier facilement... mais parfois, c'est moins simple. Dans l'exemple ci-dessous, les photos d'un smartphone ne contenaient pas de préfixe... seules les regex associées à la commande find pouvaient donc m'aider :

mogrify -resize 30% -quality 70  image_6[45][0-9].JPG renommera image_640.JPG à image_659.JPG.

pour aller plus loin, on peut utiliser d'abord la commande find :

find . -regextype posix-extended -regex '^./201511[0-9]{2}_[0-9]{6}\.jpg' -exec mogrify -resize 3145728@\> -quality 70 -verbose {} \;

j'avoue, comme dirait certain, ça pique !