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...
Nous allons utiliser l’excellent fink pour installer ce programme sur notre Mac.
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.
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...
identify fichier [ fichiers ... ]
La commande est des plus simple, identify prend comme argument le nom et éventuellemnt le chemin de l’image à identifier.
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.
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...
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 :
Convertir des images dans un autre
format par lots depuis la ligne de commande :
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 :
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 :
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 :
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 :
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.
Ce qui nous donne :
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...
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.
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.
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.
Ce script permet de créer un fichier d’index image du contenu d’un dossier.
Ce script permet de convertir les image d’un dossier dans un autre format.
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 ;)
http://imagemagick.sourceforge.net/
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
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.convert -geometry 60x80 image.gif out.gifredimensionne 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.
#!/bin/sh(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
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
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 *.gifCela convertira tous les fichiers gif plus le fichier xxx.jpg.
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.
<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.
for f in $* ;doLe 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.
convert -geometry 80x80 $f t_$f
echo "<a href=\"$f\"><img src=\"t_$f\" width=\"80\" height=\"80\">"
done
convert image.gif image.jpgConvert utilise l'extension du nom de fichier pour savoir quel format il doit utiliser.
for f in $* ;doImageMagick reconnaît aussi un grand nombre d'autres formats.
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
combine -gravity SouthEast -compose Over img.jpg logo.gif stamp_img.jpgL'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.
identify image.jpgQu'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 :
results in
image.jpg 340x254 DirectClass 13939b JPEG 0.1u 0:01
<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}'Il faut maintenant séparer largeur et hauteur. On peut le faire avec :
results in
340x254
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=$1Pour 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 :
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\">"
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 !