./coquillages && perles

Le demi-site de Josquin

Pour une poignée de dollars

On utilise souvent les scripts bash avec des applications externes. Ils sont par exemple très utile avec ImageMagick.

La commande suivante génère l'image d'un texte ("test") noir sur fond blanc, dans un fichier nommé test.png :

convert -background white -fill black -gravity center -pointsize 36 -size 100x100 -density 120 caption:test test.png

Imaginons maintenant que je souhaite en garder une trace et le rendre plus souple, je vais donc réaliser un script. Dans un fichier texte_par_imagemagick.sh, je tapes les lignes :

convert -background white -fill black -gravity center -pointsize 36 -size 150x100 -density 120 caption:test test.png

Dans le terminal, je lance mon script par un sh texte_par_imagemagick.sh. Et il me crée mon test.png, formidable ? Non, rien de nouveau. Jusqu'ici l'intérêt est limité à un aide mémoire.

Toutefois, et c'est ici que je voulais en venir (ce superbe titre en est un indice) on peut passer des arguments au script par exemple sh texte_par_imagemagick.sh mon_texte. A l'exécution, cet argument est stocké dans $1, que je n'ai plus qu'à placer à l'endroit indiqué à cet usage :

convert -background white -fill black -gravity center -pointsize 36 -size 150x100 -density 120 caption:$1 test.png

Premier problème, j'ai écrasé mon fichier test.png avec mon nouveau texte. On va donc utiliser un second argument, qui sera stocké, vous le devinez dans $2.

convert -background white -fill black -gravity center -pointsize 36 -size 150x100 -density 120 caption:$1 $2.png

sh texte_par_imagemagick.sh mon_texte nouveau, crée un fichier nouveau.png avec mon_texte en noir sur fond blanc.

Deuxième difficulté, mon image n'est pas assez large pour contenir mon mot. Imaginez avec anticonstitutioneuropéenne. Il me faut donc redéfinir la largeur et augmenter le premier nombre dans -size 150x100. Et le mieux est que mon script calcule une valeur en fonction du nombre de lettres contenues dans le mot stocké dans $1.

J'obtient la longueur de cette chaine avec : ${#1} je la multiplie par la taille de mes caractères pour obtenir une largeur suffisante, ici pointsize est de 36. pour effectuer le calcul au sein de mon unique ligne, je protège l'opération avec une "expansion arithmétique". Bash vous offre deux possibilités : $[ 2 + 2 ] ou $(( 2 + 2 )). Attention aux espaces ou vous aurez droit à un message d'erreur. Je dois donc intégrer à mon script -size $(( ${#1} * 36 ))x100 pour obtenir une largeur suffisante :

convert -background white -fill black -gravity center -pointsize 36 -size $(( ${#1} * 36 ))x100 -density 120 caption:$1 $2.png

Je peux maintenant générérer des images de mot en toute tranquilité :

sh texte_par_imagemagick oui oui
sh texte_par_imagemagick non non

Je peux, par exemple, générer une image avec une adresse email pour l'afficher sur internet sans faciliter la vie aux spammeurs :

sh texte_par_imagemagick gauzito@gmail.com email

Je vous vois venir : « il est nul ton script, en plus les lettres ont pas toutes la même largeur donc le calcul est approximatif, en plus ça marche qu'avec un seul mot ! » Bon d'accord, mais là l'idée c'était juste d'illuster le passage d'arguments... D'ailleurs, pour ceux que ça intéresse $0 stocke le nom du script (ici texte_par_imagemagick.sh).