Poursuivons notre entraînement et ajoutons quelques fonctionnalités à notre script.
Dans la leçon précédente, nous avons créé une fonction vide et nous l’avons enregistrée dans GIMP. Dans la présente leçon, nous voulons donner quelque fonctionnalité à notre script : créer une nouvelle image, lui ajouter le texte de l’utilisateur et redimensionner l’image pour qu’elle s’adapte exactement au texte.
Once you know how to set variables, define functions and access list members, the rest is all downhill — all you need to do is familiarize yourself with the functions available in GIMP's procedural database and call those functions directly. Open the Section 12.9, « Navigateur de Procédures ».
Commençons par fabriquer une nouvelle image. Nous créons pour cela une nouvelle variable theImage
, réglée pour appeler la fonction gimp-image-new
intégrée à GIMP.
As you can see from the DB Browser, the function
gimp-image-new
takes three parameters — the
image's width, height and the type of image. Because we'll
later resize the image to fit the text, we'll make a 10×10 pixels
RGB
image. We'll store the image's width and sizes in some
variables, too, as we'll refer to and manipulate them later in
the script.
(define (script-fu-text-box inText inFont inFontSize inTextColor) (let* ( : define our local variables : create a new image: (theImageWidth 10) (theImageHeight 10) (theImage (car (gimp-image-new theImageWidth theImageHeight RGB ) ) ) (theText) :a declaration for the text :we create later
Note : Nous avons utilisé la valeur RGB pour spécifier que l’image est une image RVB. Nous aurions pu aussi utiliser 0, mais RGB est nettement plus parlant.
Vous devriez aussi avoir remarqué que nous avons pris la tête du résultat de la fonction « call ». Cela peut paraître étrange parce que la base de donnée nous dit explicitement qu’elle ne retourne qu’une seule valeur – l’ID (identificateur) de la nouvelle image créée. Mais toutes les fonctions GIMP retournent une liste, même s’il n’y a qu’un seul élément dans la liste.
Maintenant que nous avons l’image, nous devons lui ajouter un calque. Nous ferons appel à la fonction gimp-layer-new
pour créer ce calque, en lui transmettant l’ID de l’image que nous venons juste de créer. (À partir de maintenant, au lieu de lister l’ensemble de la fonction, nous ne listerons que les lignes que nous lui ajoutons. Vous pouvez voir ici le script complet). Et puisque nous avons déclaré toutes les variable locales dont nous aurons besoin, nous pouvons aussi fermer les parenthèses marquant la fin de nos déclarations de variables :
;create a new layer for the image: (theLayer (car (gimp-layer-new theImage theImageWidth theImageHeight RGB-IMAGE "layer 1" 100 LAYER-MODE-NORMAL ) ) ) ) ;end of our local variables
Ce nouveau calque obtenu, nous devons l’ajouter à l’image :
(gimp-image-insert-layer theImage theLayer 0 0)
Et maintenant, juste pour le plaisir, admirons le fruit de notre travail jusqu’ici, en ajoutant cette ligne qui affichera la nouvelle image vide :
(gimp-display-new theImage)
Save your work, restart GIMP, run the script and a new image should pop up. It will probably contain garbage (random colors), because we haven't erased it. We'll get to that in a second.
Supprimez la ligne d’affichage de l’image (ou mettez-la en commentaire en plaçant un ;
en premier caractère de la ligne).
Avant d’ajouter le texte à l’image, nous devons fixer les couleurs de premier-plan (foreground) et d’arrière-plan (background), de façon à ce que le texte apparaisse dans les couleurs que l’utilisateur a spécifiées. Nous utiliserons pour cela les fonctions gimp-context-set-back/foreground :
(gimp-context-set-background '(255 255 255) ) (gimp-context-set-foreground inTextColor)
Les couleurs étant correctement réglées, nettoyons les résidus présents dans l’image en remplissant le calque avec la couleur d’arrière-plan :
(gimp-drawable-fill theLayer FILL-BACKGROUND)
L’image nettoyée, nous sommes prêts à ajouter un texte :
(set! theText (car (gimp-text-font theImage theLayer 0 0 inText 0 TRUE inFontSize inFont) ) )
Malgré un appel de fonction un peu long, il est facile à comprendre si vous suivez les paramètres tout en consultant les entrées de la fonction dans le Navigateur de Procédures. À la base, nous créons un nouveau calque de texte et nous l’assignons à la variable theText
.
Maintenant que nous avons le texte, nous pouvons nous intéresser à sa hauteur et à sa largeur, et adapter l’image et le calque d’image à la taille du texte :
(set! theImageWidth (car (gimp-drawable-get-width theText) ) ) (set! theImageHeight (car (gimp-drawable-get-height theText) ) ) (gimp-image-resize theImage theImageWidth theImageHeight 0 0) (gimp-layer-resize theLayer theImageWidth theImageHeight 0 0)
Si vous êtes comme moi, vous vous demandez probablement quelle différence il y a entre un « drawable » et un calque (NdT: faute de mieux, je traduis « drawable » par "élément graphique", ce qui enlève pas mal d’intérêt à cette remarque de l’auteur) . Un élément graphique est tout objet de GIMP pouvant être peint : les sélections, les masques de calque, les masques de canaux et aussi les calques. Les calques sont un type particulier d’élément graphique.
Notre image étant prête, nous pouvons rajouter notre ligne d’affichage de l’image :
(gimp-display-new theImage)
Save your work, restart GIMP and give your first script a run!
Quand vous essayez de fermer une image modifiée sans l’avoir enregistrée au préalable, GIMP vous demande de l’enregistrer. L’image est en effet marquée par un drapeau de modification. Dans le cas de notre script, c’est une nuisance car nous ne faisons que tester nos modifications sans vouloir modifier définitivement l’image elle même – nous pouvons reproduire l’effet du script comme nous voulons. Il est donc judicieux d’annuler ce drapeau de modification.
Nous pouvons faire cela après l’affichage de l’image :
(gimp-image-clean-all theImage)
Ceci mettra le drapeau de modification à 0, faisant comme si l’image n’avait pas été modifiée.
Ajouter ou non cette ligne est affaire de goût personnel. Je l’utilise dans les scripts qui produisent une nouvelle image sans intérêt prononcé. Si votre script est très complexe, ou si vous travaillez sur une image existante, vous ne voudrez sûrement pas utiliser cette fonction.