Les scripts fu par titix

Auteur Laetitia Marin

sortie gimpfr
smiley script

J'ai choisi cet exemple parce qu'il met en oeuvre des fonctions simples de sélection, de remplissage, et un greffon, qui sont à mon humble avis les choses les plus simples et les premières a apprendre avec les scripts fu. Nous serons bien d'accord pour dire qu'en lui même ce script est totalement inutile =) Ce tutorial n'est pas linéaire, il se veut explicatif sur la base d'un script existant.

Ce script prend un argument : 'radius', nous verrons en fin de tutorial comment passer des arguments à un script.

step 1

d'abord un cercle parfait
(gimp-ellipse-select img 10 10 (* radius 2) (* radius 2) REPLACE TRUE 0 0)

pour cela nous utilisons une image img celle-ci a été créée comme suit :
(img (car (gimp-image-new (+ (* radius 2) 20) (+ (* radius 2) 20) RGB)))

cette déclaration va créer l'image, et ici elle est emprisonnée dans un let de maniére à être réutilisable. (je tiens a entrer dans le script pas à pas, à la fin il sera complet)

à la fin du script on rendra l'image visible par :
(gimp-display-new img)

step 2

maintenant nous voulons remplir ce cercle de jaune vif nous choisissons le jaune en couleur de premier plan
(gimp-palette-set-foreground '(255 255 0))

la couleur de premier plan va donc être changée. nous l'aurons donc dans le let supérieur préalablement sauvée avec la couleur de fond
(old-bg-color (car (gimp-palette-get-background)))
(old-fg-color (car (gimp-palette-get-foreground)))

nous la restituerons a la fin
(gimp-palette-set-foreground old-fg-color)
(gimp-palette-set-background old-bg-color)

step 3

maintenant nous remplissons
(gimp-bucket-fill shape FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)

pour remplir nous avons besoin d'une zone dessinable (un layer) créée dans le let supérieur par :
(shape (car (gimp-layer-new img (+ (* rayon 2) 20) (+ (* rayon 2) 20) RGBA_IMAGE "Shape" 100 NORMAL)))

ajoutée a l'image par :
(gimp-image-add-layer img shape 0)

mise à zero par :
(gimp-edit-clear shape)

step 4

maintenant le sourire et les yeux :

nous allons définir quelques tailles dans le let supérieur
(smile-pos (+ 10 (/ radius 3)))
(smile-radius (* (/ radius 3) 4))
(eye-l-pos-x (+ 10 (/ (* radius 2) 3)))
(eye-r-pos-x (+ 10 (- (+ radius (/ radius 3)) (/ radius 4))))
(eye-pos-y (+ 10 (/ radius 2)))
(eye-radius-x (/ radius 4))
(eye-radius-y (/ radius 3)))

nous allons créer une selection qui remplace l'ancienne (REPLACE)
(gimp-ellipse-select img smile-pos smile-pos smile-radius smile-radius REPLACE TRUE 0 0)

on a besoin d'un espace à remplir, on va créer une bordure au cercle
(gimp-selection-border img 2)

on soustrait (SUB) la partie supérieure du cercle bordé pour créer le sourire
(gimp-rect-select img 10 10 (* radius 2) radius SUB TRUE 0)

on ajoute (ADD) 2 cercles pour les yeux
(gimp-ellipse-select img eye-l-pos-x eye-pos-y eye-radius-x eye-radius-y ADD TRUE 0 0)
(gimp-ellipse-select img eye-r-pos-x eye-pos-y eye-radius-x eye-radius-y ADD TRUE 0 0)

maintenant nous pouvons remplir
(gimp-palette-set-foreground '(0 0 0))
(gimp-bucket-fill smile FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)))

step 5

maintenant on va zapper le passage de la sélection en croissant du reflet. Il y a juste à savoir que l'on va sélectionner un cercle et lui soustraire un cercle plus petit.

maintenant on va remplir ce croissant de blanc, a l'intensité 50
(gimp-palette-set-foreground '(255 255 255))
(gimp-bucket-fill reflet FG-BUCKET-FILL NORMAL-MODE 50 0 FALSE 0 0)

et appliquer un gaussian blur dessus : un flou gaussien est appliqué à l'image "img" et le layer "reflet" avec un niveau de 15 en X et 15 en Y.
(plug-in-gauss-iir2 TRUE img reflet 15 15)

maintenant on va dupliquer ce calque appellé "reflet"
(gimp-layer-copy reflet TRUE)

ceci dans le let supérieur sous le nom de 'reflet2'
(reflet2 (car (gimp-layer-copy reflet TRUE)))

et enfin l'ajouter à l'image
(gimp-image-add-layer img reflet2 1)

et le tourner de 180° pour le placer a l'opposé du premier
(gimp-rotate reflet2 TRUE 3.14159)

opération terminée !

step 5

reste a enregistrer le script dans la base de données avec son nom, sa place et ses arguments

(script-fu-register
"script-fu-smiley"
"<Toolbox>/Xtns/Script-Fu/Button/Smiley"
<--- accessible par Xtns -> Script-Fu -> Button -> Smiley
"yellow smiley face"
"MARIN Laetitia"
"MARIN Laetitia"
"Fev 2000"
""
SF-VALUE "Radius" "64")

j'ai parlé de passage d'argument à la premiére étape de ce tutorial.
SF-VALUE "Radius" "64"

c'est lui l'argument "radius" pris en paramètre. On doit forcément lui donner une valeur par défaut, ici "64". Si la valeur spécifiée n'est pas correcte ou d'un mauvais type, elle sera rejetée explicitement par gimp a l'interprétation. "SF-VALUE" est quant à lui le type de cet argument. "Radius" est le nom prompté par le script dans la fenêtre de dialogue.

Il existe plusieurs types d'arguments, les plus courants sont
"SF-IMAGE", pour une image ouverte dans gimp
"SF-DRAWABLE", pour un calque d'une image ouverte dans gimp
"SF-COLOR", pour une couleur initialisée par un triplet [ exemple '(255 255 255)]
"SF-TOGGLE", pour une case à cocher (TRUE or FALSE)
"SF-OPTION", pour un menu déroulant avec des valeurs prédéfinies par une liste simple, [exemple : '("pique" "coeur" "carreau" "trefle") ] dont les valeurs seront numérotées de 0 a taille-liste-1.
"SF-VALUE", pour une valeur quelconque modifiable à la main

Enfin pour accepter l'argument, on le place dans le define du script fu de manière a pouvoir l'utiliser dans le corps du script (dans l'ordre d'arrivée).
(define (script-fu-smiley radius) ...

NB : On peut parfaitement faire un script sans argument.

NB : si on veut enregistrer un script qui s'applique sur une image déja existante on procédera de la façon suivante à l'enregistrement :

Pour l'emplacement "physique" du script on le relie à l'image :
"<Image>/Script-Fu/Decor/Stamp" <--- accessible par Image -> Script-Fu -> Decor -> Stamp

Les 2 arguments obligatoires sont :
SF-IMAGE "Image to stamp" 0 <--- argument obligatoire, l'image traitée
SF-DRAWABLE "Drawable to stamp" 0) <--- argument obligatoire le calque traité

les arguments obligatoires peuvent être suivis d'arguments facultatifs et seront traités dans le même ordre par le script
(define (script-fu-stamp img drawable facultativ-arg ...) .....

ici se trouve le récapitulatif du script

les points importants à se rappeller en matière de script fu :

  1. ne pas nommer 2 fonctions différentes du méme nom, c'est la dernière interprétée qui serait gardée.
  2. utiliser emacs (c'est si joli).

    bien fermer les parenthèses (erreur au lancement du gimp si elles sont en nombre insuffisant; erreur a l'exécution si elles sont mal placées).

    bien vérifier que toutes les variables utilisées sont déclarées (erreur à l'exécution).

  3. au lieu de relancer gimp bêtement (comme moi la premiére fois), utiliser exts -> scriptfu -> refresh.
  4. tous les noms de variables contiennent des - et pas des _ (NORMAL-MODE par exemple).
  5. attention les commandes fu diffèrent entre la version 1.1 et la version 1.2 du gimp. Les commandes que je viens d'utiliser sont valables uniquement pour gimp 1.2.
  6. utiliser exts -> browse procédure database pour voir les noms des fonctions et connaitre leur arguments.

    la recherche par nom effectue une recherche sur les noms des funcs, et par blurb sur leur description.