29-11-2011 : Remettre dans le débat politique les principes du Conseil National de la Résistance
17-02-2012 : Pétition pour une protection de l’apiculture et des consommateurs face au lobby des OGM
Logo de mon site
Logo de mon site
Faire un don

Luxpopuli / Système / Multimédia / Linux : script de traitement par lot d'images





Right menu

Logo du site ez.no  Logo XHTML 1.O du W3C  Logo XHTML 1.O du W3C  Site francophone officiel de Firefox
zero papier grâce aux catalogues et promos en ligne de bonial

Linux : script de traitement par lot d'images

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:

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.

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