Les outils graphiques ImageMagick

Les outils graphiques ImageMagick

Automatiser la manipulation d’images
Les outils graphiques ImageMagick, shell, , ImageMagick, , images, , Script, , image

Un des plus grands avantages des systèmes en ligne de commandes est l’automatisation. Il n’est pas question ici de retouche d’images mais de traitements en masse (par lot) de gros volumes d’images ou de photos.

On peut vouloir automatiser ce traitement d’images même si on ne dispose pas d’applications professionelles telles que Photoshop (voir un article d’Ovide sur les traitements par lots ici). Il est vrai que ces applications sont très onéreuses, si l’on veut être en règle au niveau de ses licences logicielles, il peut être interrêssant d’explorer les possibilités des programmes libres de droits...

L’utilisation de scripts dans le langage du shell est très puissante pour piloter des programmes libres de droits permettant de manipuler les images (1). le présent article ne prétend pas tout explorer l’étendue de ces immenses possibilités, mais simplement approcher d’un peu plus prêt cet univers.

ImageMagick est une suite d’outils permettant de convertir, modifier, dimensionner, fusionner, retailler et transformer plus de 68 formats de fichiers graphiques. Elle est utilisée sur beaucoup de systèmes sous GNU/Linux et différents BSD.

Cette suite graphique comprend entre autre les programmes suivants :

-  import : capture d’une partie ou de la totalité de l’image de l’écran

-  identify : identification et description du format d’un ou de plusieurs fichiers image

-  convert : conversion d’un fichier image d’un format dans un autre

-  display : affichage, manipulation et traitement des fichiers image

-  animate : affichage d’une séquence d’image

-  montage : création d’un ensemble d’images, composé à partir de plusieurs autres images

-  mogrify : traitement d’une image ou d’une séquence d’images

-  combine : création d’une image par combinaison de plusieurs autres images

-  segment : segmentation d’une image

-  xtp : récupération, affichage ou impression de fichiers image en provenance d’un site éloigné, par l’intermédiaire d’un réseau, ou envoi dans le réseau de tels fichiers

Nous utiliserons certaines de ces commandes dans des scripts...

Installer ImageMagick avec fink

Nous allons utiliser l’excellent fink pour installer ce programme sur notre Mac.


% fink install imagemagick

Suivant la puissance de votre machine, l’installation peut être très longue, attendez vous à la mise en place de nombreux scripts et librairies graphiques. Malgrès tout, le jeu en vaut la chandelle, vous allez vous retrouver avec toute une série d’outils libres de droits (donc gratuits), qui vont vous permettre une foule de manipulations sur les fichiers image.

Les commandes ImageMagick

Une fois installé, ImageMagick se pilote grâce à une série de commandes écrites directement sur la ligne de commande ou dans des scripts de shell...

Identifier une image

identify fichier [ fichiers ... ]

La commande est des plus simple, identify prend comme argument le nom et éventuellemnt le chemin de l’image à identifier.


[al:~/Pictures] gunjin% identify test.jpg
test.jpg JPEG 623x150+0+0 DirectClass 8-bit 38.8k 0.0u 0:01

Nous obtenons un résumé sommaire d’informations sur l’image.

Ajouter l’option -verbose permet d’obtenir une description complète du fichier graphique.


[al:~/Pictures] gunjin% identify -verbose test.jpg
 Image: test.jpg
 Format: JPEG (Joint Photographic Experts Group JFIF format)
 Geometry: 623x150
 Class: DirectClass
 Type: true color
 Depth: 8 bits-per-pixel component
 Colors: 1038
 Resolution: 72x72 pixels/inch
 Filesize: 38.8k
 Interlace: None
 Background Color: grey100
 Border Color: #DFDFDF
 Matte Color: grey74
 Dispose: Undefined
 Iterations: 0
 Compression: JPEG
 comment: AppleMark
 signature: 83b651090dd33ddbacc314cc5121ba932ea40afc509458b4bfe614de6b5d1334
 Tainted: False
 User Time: 0.0u
 Elapsed Time: 0:01

Cette fois la commande identify nous apporte plus d’informations avec la taille, profondeur de couleur, type de format, signature, nombre de couleurs utilisées, etc...

Convertir une image

convert [ options ... ] fichier_source fichier_cible

La commande convert, dans son expression la plus simple, nécessite deux arguments, le fichier de départ, et le fichier d’arrivée. Elle va nous permettre entre autre de transformer le format des fichiers :


% convert image.jpg image.tif

% convert image.jpg GIF:image.gif

% convert image.jpg GIF87:image_2.gif

-  Convertir des images dans un autre format par lots depuis la ligne de commande :


% cd /Chemin/MonDossierImages/
% mkdir -p Tiffs
% foreach f (`/bin/ls *.jpg`)
foreach -> convert $f Tiffs/`basename $f .jpg`.tif
foreach -> end

On se rend dans le dossier d’images à convertir, on crée ensuite un dossier Tiffs si il n’existe pas avec la commande mkdir. Pour chaque fichier qui se termine par .jpg, on les converti dans le dossier Tiffs en jpg. Nous utilisons pour se faire l’instruction foreach pour créer une boucle (2).

La commande basename permet d’enlever une partie d’une chaine de caractères. Donc la commande basename photo.jpg .jpg retourne photo, auquel on rajoute l’extension .tif.

-  Tranformation de la taille d’images

L’option -geometry de convert permet d’automatiser le redimentionnement des images :


% cd /Chemin/MonDossierImages/
% mkdir -p Mini
% foreach f (`/bin/ls *.jpg`)
foreach -> convert -geometry 640 $f Mini/$f
foreach -> end

Là aussi nous utilisons une boucle foreach pour réaliser une copie de nos fichiers. C’est très pratique pour réaliser des apreçus d’images qui serviront sur un site web...

-  D’autres options peuvent être employées pour des transformations simples :

-  -rotate suivi d’un nombre de degrès.
-  -flip miroir vertical.
-  -flop miroir horizontal.
-  -negate pour inverser les couleurs.
-  -monochrome pour transformer les images en noir et blanc.
-  etc...

Il existe de nombreuse options à cette commande, je vous invite à lire le manuel pour vous rendre compte des possibilités de convert :


% man convert

Montage d’images

montage [ options ... ] fichiers_source fichier_cible

Grâce à la commande montage, il nous est possible par exemple de réaliser un index d’un dossier d’images, contenant un certain nombre d’informations, comme l’aperçu de chaque image en miniature, avec le nom, la taille en Kilo Octet, etc...

La création d’index peut être très utile pour obtenir un aperçu d’un dossier, on peut le réaliser avec la commande montage en une seule ligne :


% montage -background white  Mes_Images/*.jpg index.jpg

Nous spécifions que le font du document sera blanc avec l’option background, puis on indique le répertoire à traiter et le nom du fichier de sortie.

Pour être vraiment utile, l’index doit au minimum comporter le nom du fichier source sous chaque vignette. Nous allons obtempérer et afficher des informations avec l’option label :


% montage -background white  -label "%f" Mes_Images/*.jpg index.jpg

Les différents arguments de l’option label sont les suivants :

-  %f pour le nom du fichier
-  %b pour la taille en Kilo Octet
-  %h pour la hauteur en pixel
-  %w pour la largeur en pixel
-  %h pour le mot clef définissant le format d’image

On peut régler aussi la qualité de compression de chaque fichier inclu dans le fichier index avec l’option quality, l’option geometry permet quand à elle de spécifier la taille des vignettes et l’eur espacement.


% montage -background white -label "%f\n%wx%h\n%b" -quality 100 -geometry 100 50 50  Mes_Images/*.jpg index.jpg

Ce qui nous donne :

(JPEG)
Index d’un dossier d’images

Voilà pour cette approche de la commande montage commande, cela parrait un peut complexe au début, mais lorsque l’on décompose les choses sont simples, il suffit de bien lire le manuel et comprendre à quoi servent les commandes et les options.

La liste des possibilités et des commandes d’ImageMagick est longue, je vous ai livré ici les principales fonctions, vous pouvez bien entendu poursuivre l’étude de cette suite graphique grâce au manuel en ligne de chaque commande...

Scripts d’automatisation

J’ai réalisé une série de scripts qui permettent un certain nombre d’actions sur des dossiers d’images, vous aller pouvoir les copier et vous en servir sur votre machine, voyons cela de plus prêt :)

Placez ces scripts dans le dossier bin de votre dossier de départ, c’est un bon endroit pour stocker vos scripts, puis créez des alias de commande pour les appeler par un simple nom, il vous suffira ensuite de vous rendre dans un dossier d’image et de les invoquer en leur passant les arguments nécessaires.

idimg.sh

Ce script permet d’identifier un certains nombre de paramètres sur les images d’un dossier, il est bien plus rapide que n’importe quel autre logiciel avec une interface graphique, pour obtenir la taille des images par exemple.

miniimg.sh

Ce script permet de créer des aperçus des images d’un dossier, on doit lui passer la taille de ceux-ci en argument.

indeximg.sh

Ce script permet de créer un fichier d’index image du contenu d’un dossier.

convertimg.sh

Ce script permet de convertir les image d’un dossier dans un autre format.

Conclusion

Sur ce principe, on peut imaginer des scripts pour réaliser automatiquement des pages web personalisées à partir d’un dossier d’images, ou pour marquer des photos avec sa signature, etc... Rien ne vous empèche de modifier ceux livrés avec cet article, en ajoutant des arguments aux commandes, ou bien d’en inventer d’autres...

De plus ImageMagick peut être utilisé avec un certains nombre de scripts et logiciels, soit dédié Internet et Web, aux travers d’application web en PHP par exemple, ou soit directement utilisé via les menus contextuels de Mac OS X, nous en reparlerons dans de prochains articles...

En tous cas ImageMagick est une bien belle suite d’outils pour traiter les images, on ne peut que féliciter chaleureusement les développeurs ;)

Lien

http://imagemagick.sourceforge.net/

 
Gunjin
> Les outils graphiques ImageMagick
Par denum le 29 juin 2004 - Menu du forum
 

Ces scripts ont un souci avec les noms comportant des espaces.

Il faut mettre des quotes inversées pour que la commande ne se trompe pas d’argument. (Astuce vue dans un forum debian)

Pour info, mon script pour convertir des scans en tif en jpg :

# !/bin/tcsh

# Conversion de toutes les images au format tiff (extensions .tif) au format jpg, qualité 90%

# Les images crées sont placées dans un sous dossier JPG du dossier de départ

mkdir JPG

# Boucle pour transformer les *.tif

foreach f ("`/bin/ls *.tif`")

echo fichier à convertir : $f

set g=JPG/`basename "$f" .tif`.jpg

echo Production de : `basename "$f" .tif`.jpg

/sw/bin/convert -quality 90 "$f" "$g"

end


  • Comment créer une séquence animée au format AVI à partir d'images GIF ?
    Vous pourrez utiliser la séquence de commandes suivantes :
    • Convertion des images des images dans le format PNG à l'aide de la commande:
      convert frame_01.gif frame_01.png
      Si vous souhaitez transformer une séquence animée au format GIF dans le
      le format AVI, vous devrez d'abord convertir chaque image de la séquence au
      format PNG à l'aide de la commande:
      convert colors_demo.gif frame_%03d.png
      Noter la présence de %03d qui précise le nom de chacune des images à créer.
      Dans le cas présent, ce nom sera frame_001.png, frame_002.png, frame_003.png...
      Vous pouvez également utiliser le format JPEG sans compression, utiliser alors:
      convert -quality 100 colors_demo.gif frame_%03d.jpg
    • Encodade dans le format spécifié, ici format AVI, suivant le codec vidéo libavcadec
      (option -ovc lavc), avec un nombre de frame par seconde de 1 (option -mf fps=1)
      mencoder "mf://toto??.png" -mf fps=1  -o output.avi -ovc lavc
      Pour obtenir une liste des codec vidéo disponibles, taper:
      mencoder "mf://toto??.png" -mf fps=1  -o output.avi -ovc help
    • La lecture se fait à l'aide de l'outils mplayer comme suit en imposant un nombre de frame
      par seconde de 5 (option -fps 5) :
      mplayer -fps 5 -loop 0 output.avi
      Le principal intérêt du format AVI est de pouvoir ensuite l'inclure dans une présentation
      de type PowerPoint ou OpenOffice
    Vous avez la possiblité de concaténer des fichiers AVI mais vous devrez repasser la commande
    mencoder pour recréer un index de temps correct.
    convert est une commande distribuée dans le package ImageMagick (http://www.imagemagick.org/).
    mencode et mplayer sont des commandes accessibles via le projet MPlayer (http://www.mplayerhq.hu).

    Les ingrédients de base

    ou qu'est-ce que ImageMagick ?

    ImageMagick est une collection d'outils graphiques pour travailler avec des images. Les outils sont l'affichage, l'importation, l'animation, le montage, la conversion, "mogrify", l'identification et la combinaison.
    Display: Si vous tapez "display &" une fenêtre d'affichage apparaît et vous pouvez directement travailler sur l'image. Via le menu (clic gauche dans la fenêtre) vous pouvez ouvrir une image, l'enregistrer ou l'effacer, la renverser ou la faire tourner, en changer les couleurs ou appliquer certains effets comme l'implosion / explosion ("implode") , l'emboutissage ("emboss"), la mise dans un cadre et bien d'autres encore.
    Avec Import vous pouvez réaliser des copies d'écran de tout votre écran ou de certaines images ou fenêtres seulement.
    Animate est un outil d'animation. Vous pouvez choisir une série d'images pour les afficher l'une après l'autre ou bien obtenir une image gif animée.
    Avec Montage vous pouvez créer une image sous forme de pavage ou obtenir une image permettant de voir chacune des images individuelles composant un gif animé.
    Convert est un outil très puissant. Vous pouvez convertir le format d'une image, par exemple une image gif en jpg. Vous pouvez aussi changer la taille d'une image et également appliquer de nombreux effets sur les images, comme l'effet "dessin à la mine" ("charcoal").
    Mogrify est similaire à "convert" à la différence qu'avec mogrify vous écrasez l'image courante alors qu'avec convert et les autres outils vous devez spécifier un nom sous lequel enregistrer le fichier modifié. Cependant, je ne l'utilise presque jamais.
    Identify vous délivre des informations à propos de l'image comme ses dimensions, sa taille, son nom, le format utilisé, etc.
    Combine combine deux images ou plus en une autre image. Vous pouvez par exemple intégrer un logo à chaque image.

    Pour utiliser les outils, vous tapez leur nom, suivi de l'option que vous souhaitez utiliser, de l'image qui sera manipulée et du nom du fichier sous lequel vous voulez enregistrer l'image modifiée.
    Si par exemple vous voulez transformer en dessin à la mine ("charcoal") l'image tux1.gif avec un facteur de 3 et enregistrer le résultat dans tux1charcoal.gif vous saisirez :
    convert -charcoal 3 tux1.gif tux1charcoal.gif

    Après ce coup d'oeil aux ingrédients bruts, essayons maintenant quelques formules :  

    Quelques formules

     

    Changer la hauteur et la largeur de vos images

    Imaginons que vous ayez une pile d'images avec les dernières victimes que vous avez transformées en crapauds et que vous souhaitiez les mettre sur votre page web. Afin de réduire le temps de chargement, vous souhaitez avoir des images plus petites.
    Avec l'outil "convert" vous pouvez rendre vos images plus petites ou plus grandes ou vous pouvez générer un index avec des aperçus (vignettes ou "thumbnails").
    La commande
    convert -geometry 60x80 image.gif out.gif
    redimensionne l'image image.gif à une largeur de 60 sur une hauteur de 80 et écrit l'image qui en résulte dans un fichier nommé out.gif.

    Pour mettre toutes vos images à une dimension de 80 sur 80 d'un coup vous pouvez taper :
    #!/bin/sh
    for f in $* ;do
    convert -geometry 80x80 $f t_$f
    echo "<a href=\"$f\"><img src=\"t_$f\" width=\"80\" height=\"80\"></a>"
    done
    # end of script
    (Saisissez ces lignes avec l'éditeur de votre choix (vi, emacs, nedit, kedit...) et enregistrez le script sous le nom mksmallimage dans votre répertoire personnel. Ensuite tapez en ligne de commande
    chmod 755 /home/katja/mksmallimage
    (utilisez le nom de votre répertoire home au lieu de katja) Vous pouvez alors utiliser le script en saisissant
    /home/votre_nom/mksmallimage xxx.jpg *.gif
    Cela convertira tous les fichiers gif plus le fichier xxx.jpg.  

    Créer des vues d'ensemble avec des vignettes

    Vous avez un CD avec la collection de tous les gens que vous avez changés en grenouilles durant les deux dernières années. Mais un sorcier rival, très jaloux de vos pouvoirs, réclame la preuve que vous avez même transformé son chien. Vous voilà bon pour passer la journée à chercher cette photo ! Cela pourrait être évité si vous aviez une vue d'ensemble de toutes les images de votre CD sous forme de vignettes. Avec ImageMagick il est très facile d'en créer une :
    display "vid:*.jpg"
    Ceci générera un répertoire visuel de toutes vos images jpg dans le répertoire courant. Ou :
    display "vid:grenouille/*"
    générera un répertoire visuel de toutes vos images dans votre répertoire grenouille.
    Un clic droit sur chacune de ces vignettes ouvre un menu dans le quel vous pouvez choisir "Load" pour voir l'image en grand.




    C'est un moyen très facile de créer une vue d'ensemble mais selon votre ordinateur la génération du répertoire de vignettes peut demander pas mal de temps et consomme beaucoup de mémoire si vous avez beaucoup d'images. C'est pourquoi nous allons maintenant écrire un petit script htmlthumbnails un peu moins gourmand de ce point de vue, puis construire une page web depuis laquelle vous pourrez d'un clic sur la vignette obtenir l'image originale.

    Le code html ressemblera à ceci :
    <a href="file.gif"><img src="t_file.gif" width="60" height="80"></a>
    Ici, le fichier original est file.gif et la vignette est t_file.gif.
    Écrivons un script qui générera les vignettes et écrira le code html pour nous.
    for f in $* ;do
    convert -geometry 80x80 $f t_$f
    echo "<a href=\"$f\"><img src=\"t_$f\" width=\"80\" height=\"80\">"
    done
    Le script ci-dessus fera le tour de toutes les images comme spécifié dans la ligne de commande, puis générera les vignettes et enfin écrira le code html à l'écran. Il ne reste plus qu'à copier ce code et à le coller dans notre page web.
    Pour un script shell complet, nous allons ajouter un peu de texte d'aide et une vérification d'erreur. Voilà notre script final, nommé htmlthumbnails :
    htmlthumbnails (html pourlire le code), htmlthumbnails (format texte pour télécharger)
     

    Changer le format d'image

    Convert peut changer non seulement la taille d'une image mais également son format. Pour par exemple transformer une image gif en jpg, la commande est simplement :
    convert image.gif image.jpg
    Convert utilise l'extension du nom de fichier pour savoir quel format il doit utiliser.
    Pour changer le format jpg en gif pour de nombreuses images, utilisez :
    for f in $* ;do
    if echo "$f" | grep -i "jpg$" > /dev/null ; then
    gif=`echo "$f" | sed 's/jpg$/gif/i'`
    echo "converting $f to $gif ..."
    convert 80x80 $f $gif
    else
    echo echo "$f is not a jpg file, ignored"
    fi
    done
    ImageMagick reconnaît aussi un grand nombre d'autres formats.  

    Mettre un logo dans toutes vos images

    Nous aimerions ajouter un petit logo comme celui que l'on peut souvent voir sur la droite des images. 

    Ce logo sera un petit gif transparent. Notre logo devra être placé comme une petite signature dans le coin inférieur droit de l'image finale comme vous pouvez voir dans l'image de Tux suivante :



    Quelle est la commande pour faire ceci ?
    L'outil Combine peut être utilisé pour combiner deux images en une nouvelle. Plusieurs options indiquent au programme comment le faire :
    combine -gravity SouthEast -compose Over img.jpg logo.gif stamp_img.jpg
    L'option "gravity SouthEast" met le logo.gif dans le coin inférieur droit. "compose Over" indique que nous remplacerons l'image par le logo aux endroits où ils se superposent.

    Pour obtenir un shell script pleinement fonctionnel, insérons la commande dans une boucle for- et ajoutons un peu de texte pour l'aide et la vérification d'erreur. Voici notre shell script final, nommé stampimages :
    stampimages (html pour lire), stampimages (texte pour téléchargement)
     

    Obtenir des informations sur les propriétés de l'image

    Identify affiche des détails sur le type d'une image, sa taille et ses dimensions. Cela donne par exemple ceci :
    identify  image.jpg
    results in
    image.jpg 340x254 DirectClass 13939b JPEG 0.1u 0:01
    Qu'est-ce que notre sorcier peut bien faire de cela ? Et bien, pour concevoir de bonnes pages web qui afficheront les images alors que la page est encore en cours de chargement, vous devez spécifier les dimensions exactes de toutes vos images. Le code html ressemblera par exemple à ceci :
    <img src="image.jpg" width="340" height="254" alt="[image d'exemple]">
    Si nos images ont des tailles différentes et que nous ignorons la hauteur et largeur exactes de chacune d'entre elles, il est possible d'appeler "identify" à notre aide. Écrivons un script shell qui lira la sortie de "identify" et ensuite imprimera cette ligne. Les dimensions de l'image sont le deuxième paramètre de la chaîne de sortie du programme identify. Pour obtenir ce paramètre, utilisons la commande awk :
    identify  image.jpg | awk '{print $2}'
    results in
    340x254
    Il faut maintenant séparer largeur et hauteur. On peut le faire avec :
    echo 340x254 | sed 's/[^0-9]/ /g' | awk '{print $1}'
    qui donnera la largeur. La hauteur sera obtenue avec :
    echo 340x254 | sed 's/[^0-9]/ /g' | awk '{print $2}'
    Ne fixez pas trop votre attention sur les commandes shell exactes. Si vous ne les comprenez pas complètement, prenez-les telles qu'on vous les donne. Il y aura un article à propos de la programmation shell dans un prochain numéro de LinuxFocus dans lequel nous expliquerons tous ces tours. Le script shell final ressemble à ce qui suit :
    file=$1
    geometry=`identify $file | awk '{print $2}'`
    # geometry can be 563x144+0+0 or 75x98
    # we need to get rid of the plus (+) and the x characters:
    width=`echo $geometry | sed 's/[^0-9]/ /g' | awk '{print $1}'`
    height=`echo $geometry | sed 's/[^0-9]/ /g' | awk '{print $2}'`
    echo "<img src=\"$file\" width=\"$width\" height=\"$height\">"
    Pour obtenir le script shell complet nous ajoutons encore du texte d'aide et la vérification d'erreur. Voici le script shell final, nommé imgsrcline :
    imgsrcline (html pour lecture), imgsrcline (format texte pour téléchargement)


    En jouant avec ImageMagick j'ai trouvé parfois des contradictions entre la documentation et les fonctionnalités réelles. Quelques-unes des caractéristiques ne sont pas très stables. Si vous vous en tenez aux choses expliquées ci-dessus vous vous rendrez compte que c'est vraiment pratique. Les fonctions évoquées dans cet article marchent vraiment. J'ai utilisé ImageMagick-4.2.9 , ImageMagick-5.2.9 et ImageMagick-5.3.0 et ce que vous avez appris ici fonctionne quelle que soit la version utilisée.

    J'espère que vous avez maintenant une petite idée de ce qu'il est possible de faire avec ImageMagick et que vous utiliserez ces scripts ou même commencerez à créer vos propres formules.
    Amusez-vous bien !

     

    Références

    • Installation: ImageMagick est certainement déjà installé sur votre système car il est habituellement inclus dans toutes les distributions Linux usuelles. Mais dans le cas contraire, ou si vous voulez une version plus récente, vous pouvez la télécharger depuis : http://www.imagemagick.org/
    • Pour plus d'information à propos des outils de ImageMagick vous pouvez consultez les man pages (tapez par exemple "man convert" pour avoir plus de détails à propos de l'outil convert) ou lire ces textes sur leur page web.
    • Si vous n'êtes pas encore familier de la programmation shell, faites chercher google sur "bash" et vous devriez trouver différents didacticiels adaptés à vos besoins. Ou attendez le prochain LinuxFocus et lisez l'article qui y sera consacré à la programmation Shell.