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))
)