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.
(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").
(cdr (cdr '("jambon" "huître" "fromage")))renvoi ("fromage") et
(car (cdr '("jambon" "huître" "fromage")))renvoi ("huître").
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" "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./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))
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.
(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.
(gimp-display-new theImage)Sauvegardez les modifications puis rafraîchissez la base par "Xtns"
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
; Michael Terry; 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" " /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))
)