Date de publication: le mercredi 14 septembre 2011 à 16h41
Dernière modification: par Pascal BOYER le jeudi 15 septembre 2011 à 00h02
» Article suivant: Assembler plusieurs fichiers VOB
Imagemagick sous Linux : convert ou le traitement des images en ligne de commande
Imagemagick est un très puissant logiciel libre de traitement d'images en ligne de commande. Les fonctionnalités d'Imagemagick couvrent un large spectre des actions que l'on peut être amené à appliquer à des images.
Vous trouverez toutes les informations nécessaires sur ces deux sites:
- site officiel: Imagemagick
- site francophone: Imagemagick
Le binaire convert
Le principal binaire que fournit Imagemagick est:
- convert
Cette commande accepte une très grande quantité d'arguments et d'options dont voici la liste:
- Utilisation de la commande convert
display, l'interface graphique d'Imagemagick
Le package imagemagick fournit également le binaire display permettant de lancer une interface graphique à Imagemagick. Cette interface, bien que riche en fonctions, ne permet pas d'accéder à l'ensemble des options de la commande en ligne convert.
La commande convert sous Debian
:
Par défaut, le binaire convert présent sous Debian est fourni par le package graphicsmagick-imagemagick-compat et non par le package imagemagick.
Le fonctionnement du binaire convert n'étant pas tout à fait identique dans les deux cas, vous risquez de constater des sorties de commandes inattendues.
GraphicsMagick est à l'origine (2002) un fork d'Imagemagick 5.5.2. Mais il est depuis lors devenu totalement indépendant et suit un développement autonome.
- Site officiel de GraphicsMagick
Pour vous éviter une perte de temps inutile, je vous recommande d'installer le package imagemagick qui désinstallera graphicsmagick-imagemagick-compat.
Exemple de dysfonctionnement:
- l'option +profile '!exif,*', permettant de ne pas supprimer les métadonnées EXIF lorsque l'on réduit la qualité (-quality XX) d'une image, ne fonctionne pas avec graphicsmagick-imagemagick-compat qui supprime tous les profiles à l'inverse d'Imagemagick qui n'en supprime aucun par défaut.
Script pour réduire le poids des images
Le script interactif ci-dessous permet de réduire la qualité de l'ensemble des images contenues par le répertoire à partir duquel est exécuté le script.
Ce script, largement commenté, effectue donc un traitement par lot des images afin d'en réduire le poids (avant leur publication sur le net par exemple):
#!/bin/bash # ACTIVATION DU MODE DEBUG #set -x echo ""; echo ""; echo ""; echo ""; echo ""; echo "##########################################################################################"; echo "# SCRIPT POUR RÉDUIRE LA TAILLE DES IMAGES DU RÉPERTOIRE COURANT -- TRAITEMENT PAR LOT #"; echo "##########################################################################################"; echo ""; echo ""; echo ""; # L'option -n supprime le retour chariot echo ""; echo "Souhaitez-vous supprimer les données EXIF ?"; echo "Leur suppression est à l'origine de l'essentiel du gain de poids réalisé (jusqu'à plusieurs dizaines de ko). "; echo "La seule dégradation de la qualité de l'image n'engendrera qu'une faible réduction du poids. "; echo "Supprimer les données EXIF: oui = 1 "; echo " non = 2 "; echo -n " Réponse>: "; # ON AFFECTE LA RÉPONSE DE L'UTILISATEUR À LA VARIABLE $supprimeExif # ( PAS DE «$» DEVANT LA VARIABLE CAR ELLE EST EN TRAIN D'ÊTRE CRÉÉE) read supprimerExif; # ON CONTRÔLE LA VALIDITÉ DE LA RÉPONSE # LA RÉPONSE DOIT ÊTRE UNE VALEUR NUMÉRIQUE ET NE DOIT PAS ÊTRE VIDE: if [ "$(echo $supprimerExif | grep "[A-Z a-z]")" ] || [ -z $supprimerExif ]; then echo ""; echo ""; echo "Vous devez répondre 1 ou 2 à la question. Veuillez relancer le script."; echo ""; echo ""; exit; fi # LA RÉPONSE VAUT-ELLE BIEN 1 OU 2 if [ $supprimerExif -ne 1 ] && [ $supprimerExif -ne 2 ]; then echo ""; echo ""; echo "Vous devez répondre 1 ou 2 à la question. Veuillez relancer le script."; echo ""; echo ""; exit; elif [ "$supprimerExif" = "1" ]; then echo ""; echo ""; echo "> Le facteur de réduction de qualité"; echo " ----------------------------------"; echo "> Sa valeur doit être comprise entre 0 et 100%"; echo "> 0 engendrera une image très dégradée (poids final le plus faible possible)."; echo "> 100 engendrera une image non dégradée dont le poids final peut être supérieur au poids initial !"; echo ""; echo -n "> Veuillez indiquer la valeur du facteur de réduction de qualité à appliquer ( de 0 à 100 ): "; # ON AFFECTE LA RÉPONSE DE L'UTILISATEUR À LA VARIABLE $facteurQualite # ( PAS DE «$» DEVANT LA VARIABLE CAR ELLE EST EN TRAIN D'ÊTRE CRÉÉE) read facteurQualite; # ON CONTRÔLE LA VALIDITÉ DE LA RÉPONSE: # LA RÉPONSE DOIT ÊTRE UNE VALEUR NUMÉRIQUE ET NE DOIT PAS ÊTRE VIDE: if [ "$(echo $facteurQualite | grep "[A-Z a-z]")" ] || [ -z $facteurQualite ]; then echo ""; echo ""; echo "Vous devez taper un nombre compris entre 0 et 100. Veuillez relancer le script."; echo ""; echo ""; exit; fi # ON PARCOURT TOUTES LES IMAGES DU RÉPERTOIRE COURANT LES UNES APRÈS LES AUTRES for i in `ls -1 *.jpg` do poidsOriginal=`ls -la $i|awk '{print $5}'`; echo "Poids original de la photo $i = $poidsOriginal octets"; # CI-DESSOUS ON APLLIQUE LE FACTEUR DE QUALITÉ ET ON SUPPRIME TOUS LES PROFILES DE METADONNÉES convert $i -interlace line -quality $facteurQualite +profile '*' $i; poidsFinal=`ls -la $i|awk '{print $5}'`; echo "Poids de la photo $i après traitement = $poidsFinal octets"; ### PAR DEFAUT, BASH NE FAIT DES CALCULS QUE SUR LES NOMBRE ENTIERS ### # ON CALCULE EN 3 FOIS LE GAIN (AVEC UNE PRÉCISION DE 10^-2) calcul1=$(echo "scale=4; $poidsFinal/$poidsOriginal"|bc); # CI-DESSOUS scale=2 N'A AUCUN EFFET ! calcul2=$(echo "(1-$calcul1)*100"|bc); # ON EXTRAIT MAINTENANT LES 5 PREMIERS CARACTÈRES DU RÉSULTAT $calcul2 CAR scale=2 N'A AUCUN EFFET calcul3="${calcul2:0:5}"; echo "Le gain est donc de $calcul3%"; echo ""; done else # ON TRAITE À PRÉSENT LE CAS OÙ $supprimerExif = 2 echo ""; echo ""; echo "> Le facteur de réduction de qualité"; echo " ----------------------------------"; echo "> Sa valeur doit être comprise entre 0 et 100%"; echo "> 0 engendrera une image très dégradée (poids final le plus faible possible)."; echo "> 100 engendrera une image non dégradée dont le poids final peut être supérieur au poids initial !"; echo "> Sans suppression des données EXIF aucun gain de poids ne sera constaté avec une valeur supérieure à 80%."; echo ""; echo -n "> Veuillez indiquer la valeur du facteur de réduction de qualité à appliquer ( de 0 à 100 ): "; # ON AFFECTE LA RÉPONSE DE L'UTILISATEUR À LA VARIABLE $facteurQualite # ( PAS DE «$» DEVANT LA VARIABLE CAR ELLE EST EN TRAIN D'ÊTRE CRÉÉE) read facteurQualite; # ON CONTRÔLE LA VALIDITÉ DE LA RÉPONSE: if [ "$(echo $facteurQualite | grep "[A-Z a-z]")" ] || [ -z $facteurQualite ]; then echo ""; echo ""; echo "Le facteur de qualité doit être compris entre 0 et 100. Veuillez relancer le script."; echo ""; echo ""; exit; fi # ON PARCOURT TOUTES LES IMAGES DU RÉPERTOIRE COURANT LES UNES APRÈS LES AUTRES for i in `ls -1 *.jpg` do poidsOriginal=`ls -la $i|awk '{print $5}'`; echo "Poids original de la photo $i = $poidsOriginal octets"; # CI-DESSOUS ON APLLIQUE LE FACTEUR DE QUALITÉ ET ON SUPPRIME TOUS LES PROFILES DE METADONNÉES SAUF EXIF convert $i -interlace line -quality $facteurQualite +profile '!exif,*' $i; poidsFinal=`ls -la $i|awk '{print $5}'`; echo "Poids de la photo $i après traitement = $poidsFinal octets"; ### PAR DEFAUT, BASH NE FAIT DES CALCULS QUE SUR LES NOMBRE ENTIERS ### # ON CALCULE EN 3 FOIS LE GAIN (AVEC UNE PRÉCISION DE 10^-2) calcul1=$(echo "scale=4; $poidsFinal/$poidsOriginal"|bc); # CI-DESSOUS scale=2 N'A AUCUN EFFET ! calcul2=$(echo "(1-$calcul1)*100"|bc); # ON EXTRAIT MAINTENANT LES 5 PREMIERS CARACTÈRES DU RÉSULTAT $calcul2 CAR scale=2 N'A AUCUN EFFET calcul3="${calcul2:0:5}"; echo "Le gain est donc de $calcul3%"; echo ""; done fi
Améliorations possibles du script
- Demander à l'utilisateur quelle est l'extension des images à traiter (par défaut, le script traite les images .jpg)
- Ajouter un premier traitement par lot de réduction de la taille des images
Commentaires














