Les Scripts-Fu

Le très célèbre logiciel de retouche d'images Gimp est à présent reconnu comme un équivalent à Photoshop sous Linux. L'une des fonctions les plus intéressantes de ce programme est la possibilité d'écrire des scripts afin d'automatiser les manipulations. Les script-fu sont des outils puissants qu'il faut savoir manipuler pour peu que l'on veuille tirer le meilleur de Gimp.

 

LES SCRIPTS FOURNIS

Si votre installation de Gimp est complète, en cliquant sur le menu " Xtns ", dans le sous-menu " Script-Fu ", vous trouverez un grand nombre de scripts déjà installés. Notez, au passage, que beaucoup de ces scripts nécessitent des polices de caractères contenues dans les packages freefonts et sharefonts. En l'absence de ces polices, Gimp vous gratifiera d'un message d'erreur au lancement du script.
Dans le sous-menu " Script-Fu ", vous avez également la console qui vous permet d'entrer des commandes de manière interactive. Cliquez sur " Console " pour la faire apparaître.
 

ECRIRE UN SCRIPT : LES VARIABLES

Ecrire un script-fu est semblable à l'écriture d'une mini-application. Le script sera interprété par Gimp et directement appliqué. Comme dans bien des langages, il est nécessaire que le programmeur ait la possibilité de stocker des valeurs et des chaînes de caractères pour les utiliser par la suite. En programmation, on appelle cela des variables.
En langage Scheme utilisé par les script-fu, on déclare la variable grâce à la commande let*. Exemple :
(let* ((a 1) (b 5)) (+ a b))
Par cette ligne, nous définissons les deux variables a et b. Dans le même temps, nous les initialisons respectivement à 1 et 5. Enfin, nous calculons a plus b. Si vous saisissez cet exemple dans la console vous verrez apparaître ==>(let* ((a 1) (b 5)) (+ a b)) puis 6.

LES LISTES

En langage Scheme, il est important de faire la différence entre une valeur atomique et une liste. Une valeur atomique est une valeur unique stockée dans une variable, comme dans l'exemple précédent. Mais on peut également stocker dans une variable une suite de valeurs.

Exemple :
(let* ((x '(1 3 2))) x)
Ici, nous avons défini la variable x, puis nous l'avons initialisé avec la liste 1 3 2. Cette ligne provoquera l'affichage de (1 3 2) et non d'une seule valeur.
Il est également possible de définir une liste avec la fonction list de la manière suivante : (list 5 4 8 7 5 6).
Pour accéder à une valeur individuelle de la liste, il faut utiliser les fonctions car et cdr. La fonction car renvoie le premier élément de la liste.

Exemple :
(car '("jambon" "huître" "fromage ")) renvoi "jambon".
La fonction cdr, quant à elle, renvoie le reste de la liste après le premier élément. Exemple :
(cdr '("jambon" "huître" "fromage")) retourne ("huître" "fromage").
Mais comment accéder à autre chose dans une liste ? Il suffit simplement d'imbriquer les fonctions. Exemple :
(cdr (cdr '("jambon" "huître" "fromage"))) renvoi ("fromage") et
(car (cdr '("jambon" "huître" "fromage"))) renvoi ("huître").
Certaines fonctions peuvent également faire de même. Par exemple cddr équivaut à (cdr (cdr et cadr équivaut à (car (cdr.

PREMIER SCRIPT-FU

Dans un premier temps, il vous faut savoir où vous désirez placer votre script et comment l'intégrer dans les menus de Gimp. Les scripts peuvent être placés dans le répertoire .gimp/scripts de votre répertoire privé ou encore dans le répertoire /usr/share/gimp/scripts.
Chaque script-fu définit au moins une fonction. C'est la fonction principale du script, celle qui fera le travail. Un script-fu doit également s'enregistrer au niveau de la " procédural database " qui est accessible par le menu " Xtns " " DB Browser ".
La fonction principale sera :
(define (script-fu-text-boite inText inFont inFontSize inTextColor))
Par cela, nous définissons la fonction " script-fu-text-box " qui recevra quatre paramètres : inText pour le texte, inFont pour la police, inFontSize pour la taille et inTextColor pour la couleur. En enregistrant cette ligne dans un fichier textbox.scm dans le répertoire des scripts de Gimp, nous ajoutons un nouveau script qui ne fait rien ! Pour enregistrer notre script dans la base de données, il faut ajouter ceci afin que Gimp enregistre un certain nombre d'informations sur le nouveau script :

(script-fu-register
"script-fu-text-box"
"<Toolbox>/Xtns/Script-Fu/Text/Text Box"
"Creates a simple text box, sized to fit around the user's choice of text, font, font size, and color."
    "Michael Terry"
    "1997, Michael Terry"
 "October 27, 1997"
 ""
SF-VALUE "Text:"  "Text Box"
SF-VALUE "Font:" "futura_poster"
SF-VALUE "Font size:"  "45"
SF-COLOR "Color:"     Î(0 0 0))

Une fois le fichier sauvegardé, lancez Gimp puis faites "Xtns" "Script-Fu" "Refresh". Puis vérifiez qu'un menu " Texte boite " s'est bien ajouté dans le menu " Text ". En cliquant dessus, vous devriez voir apparaître la fenêtre en figure 1. Dans le DB Browser, notre script doit également apparaître figure 2.
Les paramètres utilisables pour l'enregistrement du script sont les suivants :

SF-VALUE :  Permet de passer un paramètre de valeur en numérique ou en chaîne de caractère.
SF-COLOR : Indique qu'une couleur est demandée comme paramètre.
SF-TOGGLE : Permet de basculer sur une valeur booléenne (oui/non).
SF-IMAGE : Permet de définir que le script opère sur une image ouverte.
SF-DRAWABLE : Ce paramètre vient en plus de SF-IMAGE et indique une action sur un layer.

ACTION DU SCRIPT-FU

Notre script a pour but de créer une nouvelle image composée autour d'un texte entré par l'utilisateur. L'image devra prendre la taille correcte par rapport au texte en fonction de la police utilisée et de sa taille.
Nous allons donc créer une image en utilisant la fonction gimp-image-new intégrée à Gimp. Notez que toutes les fonctions disponibles dans Gimp sont répertoriées dans DB Browser.
Les paramètres à passer pour la création de l'image sont sa largeur et sa hauteur. Pour cela, ajoutez le
texte suivant dans notre fichier text
 

box.scm (avant la fonction d'enregistrement) :
(let*
(
(theImageWidth  10)
(theImageHeight 10)
(theImage (car (gimp-image-new theImageWidth theImageHeight RGB) ) )
(theText)

Nous définissons une hauteur et une largeur de 10. Puis nous définissons une nouvelle variable "theImage" qui accueillera l'ID de l'image créée grâce à la fonction car. Notez que nous déclarons aussi la variable theText pour le texte de l'utilisateur que nous utiliserons plus tard.

A présent que nous avons créé l'image, il faut ajouter un layer pour y mettre le texte. La fonction "gimp-layer-new" se chargera de l'opération en lui passant l'ID de l'image fraîchement créée :
(theLayer (car (gimp-layer-new theImage theImageWidth theImageHeight RGB_IMAGE "layer 1" 100 NORMAL) ))
Puis nous ajoutons ce layer à l'image :
(gimp-image-add-layer theImage theLayer 0)
Enfin nous affichons l'image :
(gimp-display-new theImage)
Si vous enregistrez ceci dans le fichier et lancez ce script depuis Gimp après avoir fait "Xtns" "script-Fu" "Refresh", vous obtiendrez certainement une image avec des couleurs aléatoires et ceci parce que l'image n'a pas été nettoyée.

A présent, ajoutons le texte. En premier lieu, supprimez la ligne qui affiche l'image, elle n'était là que pour l'exemple. Avant d'ajouter le

texte, nous devons donner une couleur au fond :
(gimp-palette-set-background Î(255 255 255) )
Ainsi que pour le texte :
(gimp-palette-set-foreground inTextColor)

Notez que c'est l'utilisateur qui renseigne la variable TextColor que nous avons défini dans la fonction principale.
Maintenant que les couleurs sont annoncées, nettoyons l'image en sélectionnant l'ensemble et en appelant la fonction " clear " :

(gimp-selection-all theImage)
(gimp-edit-clear theImage theLayer)
(gimp-selection-none theImage)
L'ajout du texte se fera par :
(set! theText (car (gimp-text theImage theLayer 0 0 inText 0 TRUE inFontSize PIXELS "*" inFont "*" "*" "*" "*")))

Il s'agit d'une fonction relativement complexe. Jetez un oeil dans DB Browser, sous la fonction gimp-text, vous y trouverez toutes les explications utiles.

A présent, nous devons redimensionner l'image pour l'accorder avec la taille du texte. Dans un premier temps, nous récupérons les dimensions du texte :
(set! theImageWidth (car (gimp-drawable-width theText)))
(set! theImageHeight (car (gimp-drawable-height theText)))

Puis nous accordons la taille de l'image :

(gimp-image-rezise theImage theImageWidth theImageHeight 0 0)
et du layer
(gimp-layer-rezise theImage
theLayerWidth theImageHeight 0 0)
La différence entre drawable et layer est très subtile. Le drawable est tout ce que l'on peut dessiner à l'intérieur et le layer est une version plus spécifique du drawable. Cette définition est relativement vague, mais dans la majorité des cas la distinction n'est pas importante.
Nous pouvons, maintenant, afficher l'image par :
(gimp-display-new theImage)

Sauvegardez les modifications puis rafraîchissez la base par "Xtns"
"Script-Fu" "Refresh". Lancez votre script et vous devriez voir apparaître la figure 3.

Note : Lorsque vous fermez l'image générée par le script-fu, Gimp vous demandera si vous désirez la sauvegarder. Cette question est assez pénible lorsque vous testez votre script. L'astuce consiste à effacer le  " dirty flag " utilisé pour faire apparaître la question :
(gimp-image-clean-all theImage)
Vous pouvez également permettre à l'utilisateur d'annuler le travail de votre script en une seule fois. En effet, la fonction " und " qui est très utile en temps normal peut être des plus ennuyeuses si l'utilisateur doit annuler chaque étape de votre script une par une. Placez donc la fonction gimp-image-disable-undo en début de script, puis gimp-image-enable-undo à la fin.

CONCLUSION ET REMERCIEMENT

Vous voilà, je l'espère, fin prêt à devenir un programmeur de script-fu. La principale source de renseignement est le DB Browser qui vous informera sur les fonctions et leurs paramètres. Je tiens à remercier Michael Terry, car sans son tutorial (d'où est tiré notre exemple), ce dossier serait criblé d'erreurs

 

TEXTBOX.SCM

; Michael Terry <mterry@soulfry.com>

; définition de la fonction
(define (script-fu-text-box inText inFont inFontSize inTextColor)
(let*
(
; création de la nouvelle image
(theImageWidth 10)
(theImageHeight 10)
(theImage (car (gimp-image-new theImageWidth theImageHeight RGB) ) )
(theText)
; création d'un nouveau layer
(theLayer (car (gimp-layer-new theImage theImageWidth theImageHeight RGB_IMAGE "layer 1" 100 NORMAL) ))
)
; Ajout du nouveau layer à l'image
(gimp-image-add-layer theImage theLayer 0)
; paramètrage des couleurs d'arrière plan et d'avant plan
(gimp-palette-set-background Î(255 255 255) )
(gimp-palette-set-foreground inTextColor)
; nettoyage de l'image
(gimp-selection-all theImage)
(gimp-edit-clear theImage theLayer)
(gimp-selection-none theImage)
; création du texte
(set! theText (car (gimp-text theImage theLayer 0 0 inText 0 TRUE inFontSize PIXELS "*" inFont "*" "*" "*" "*")))
; récupération de la hauteur et de la largeur
(set! theImageWidth  (car (gimp-drawable-width  theText) ) )
(set! theImageHeight (car (gimp-drawable-height theText) ) )
; redimensionnement de l'image
(gimp-image-resize theImage theImageWidth theImageHeight 0 0)
(gimp-layer-resize theLayer theImageWidth theImageHeight 0 0)
; affichage de l'image
(gimp-display-new theImage)
; paramètrage du dirty flag
(gimp-image-clean-all theImage)
))
; Enregistrement de la fonction dans Gimp
(script-fu-register
"script-fu-text-box"
"<Toolbox>/Xtns/Script-Fu/Text/Text Box"
"Création d'une boite, à la dimension du texte en fonction de la police, la taille et la couleur."
"Michael Terry"
"1997, Michael Terry"
"October 27, 1997"
""
SF-VALUE "Texte:"       "Text  Box"
SF-VALUE "Police:"       "futura_poster"
SF-VALUE "Taille:"  "45"
SF-COLOR "Couleur:"      Î(0 0 0))
)
 

 

 

 


© Copyright 2000 Diamond Editions/Linux magazine France - Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; A copy of the license is included in the section entitled "GNU Free Documentation License".