GIMP Script-fu - Tracer des lignes sur une image


Problématique

La page GIMP Script-fu Dessiner des pixels sur une image présente une méthode pour dessiner automatiquement, à l’aide d’un script, des pixels en couleur sur une image. Cette méthode peut être utilisée pour insérer automatiquement, sur une image, n’importe quel dessin défini au pixel près et notamment un cadre en couleur.

Lorsqu’on souhaite mettre en place des cadres relativement larges, cette méthode n’est cependant pas satisfaisante car le traitement pixel par pixel d’un lot important d’images peut se révéler relativement long.. La méthode présentée ici permet de mettre rapidement en place des cadres de largeurs et de couleurs variées sur des images, sans modifier leurs dimensions de ces images.

Avant d’écrire des scripts permettant d’encadrer des images avec des cadres de ce type, on va écrire un script permettant de dessiner des lignes d’épaisseurs diverses afin de voir comment se comporte un pinceau épais positionné en un point de coordonnées (x,y) d’une image. L'exemple ci-après dessine, sur une image ouverte dans GIMP, une ligne rouge d'épaisseur s variable entre deux points de coordonnées x,y égales à (5,5) et (5,10).

Dessiner une ligne sur une image

Ecrire et enregistrer le script

Ecrire le script suivant avec le Bloc-Notes, le sauvegarder avec le nom «ligne.scm» (l’utilisation de ce nom est obligatoire car il doit correspondre à celui indiqué dans le script afin que GIMP puisse l’enregistrer correctement). Puis placer ce fichier dans le répertoire «C:/ Program Files/ GIMP/ lib/ gimp/ 2.0/ share/ gimp/ 2.0/ scripts».

Remarques :

  • Le paramètre «inImage» passé à la fonction define est associé à la ligne «SF-IMAGE "inImage" 0» située en fin de script. Il correspond à l’image en cours située dans la fenêtre principale de GIMP ;
  • La première partie du script consiste à déclarer les variables qui seront utilisées par le script. Il est à noter que la ligne maligne est définie à l’aide d’un tableau de 4 double destiné contenir les abscisses et les ordonnées des 2 points qui définissent le tracé ;
  • Les lignes suivantes consistent à créer un nouvelle brosse (pinceau) appelée «mabrosse» et à utiliser cette brosse comme brosse courante ;
  • Les deux lignes suivantes permettent de fixer la couleur et l’épaisseur du nouveau pinceau qui va être utilisé ;
  • Les 4 lignes suivantes définissent les coordonnées des 2 points entre lesquels la ligne va ête dessinée. Dans cet exemple, il s’agit des points (5,5) et (5,10) ;
  • L’instruction «(gimp-pencil inLayer n maligne ) » effectue le tracé entre les 2 points ;
  • L’instruction «( (gimp-displays-flush) » annule toutes les mises à jour en attente ;
  • La partie script-fu-register permet de faire enregistrer le script par Gimp. L’instruction "/MesScripts/ligne" indique à GIMP que le script doit être accessible depuis la fenêtre principale de Gimp avec l’option de menu «MesScripts/ligne».

;=================
; Ce script trace une ligne entre deux points, sur une image ouverte dans GIMP,
; à l'aide d'un pinceau dont l'épaisseur peut être modifiée.
; il permet d'analyser comment le tracé se positionne exactement, selon son
; épaisseur, sur un point de coordonnées données.
; Auteur : Claude Turrier - juin 2016
;----------------
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;=================
(define (script-fu-ligne inImage inLayer )
(let* ( ( n 4) (maligne (cons-array 4 'double)) )
(gimp-brush-new "mabrosse")
(gimp-brushes-refresh)
(gimp-context-set-brush "mabrosse")
(gimp-context-set-brush-aspect-ratio 0)
;-----couleur et épaisseur du pinceau modifiables----
(gimp-context-set-foreground '(255 0 0)); couleur rouge
(gimp-context-set-brush-size 1) ; épaisseur du pinceau en pixels
;------------------
(aset maligne 0 5) ; x point 1
(aset maligne 1 5) ; y point 1
(aset maligne 2 5) ; x point 2
(aset maligne 3 10) ; y point 2
(gimp-pencil inLayer n maligne ) ; tracé entre les 2 points
(gimp-displays-flush)
);let
) ; def

(script-fu-register "script-fu-ligne"
"<Image>/MesScripts/ligne"
"---------------"
"Trace une ligne sur une image"
"Claude Turrier"
"2016"
"---------------"
SF-IMAGE "inImage" 0
SF-DRAWABLE "inLayer" 0
)

Créer une nouvelle image

Ouvrir GIMP et créer une nouvelle image de taille 100x100 avec la couleur de l’arrière plan blanc par exemple.

002

On remarque que dans le réglage utilisée par défaut aucne grille n’apparaît dans la fenêtre GIMP d’affichage de cette image.

003

Afficher une grille au dessus de l'image dans la fenêtre de Gimp

Pour faire apparaître une grille de 1 pixel de coté, au dessus de l’image, dans la fenêtre principale GIMP, cliquer « Edition/Préférence » puis dans la rubrique « Grille par défaut » fixer l’espacement de la grille, en hauteur et en largeur, à 1 pixel.

004

Puis cliquer « Affichage/Afficher la grille »

005

Saisir 1600% dans la liste déroulante située en bas de la fenêtre GIMP. L’image blanche apparaît en zoom 1600% avec la grille au dessus d’elle.

006

Exécuter le script

On peut examiner, à l’aide du script «dessin.scm», comment le pinceau trace les lignes entre deux points en fonction de son épaisseur. Pour cela, on remplace la valeur 1 par la valeur s choisie pour la taille du pinceau dans l’instruction «(gimp-context-set-brush-size)».

Pour exécuter le script cliquer «MesScripts/ligne»

007

Remarque :
ne pas oublier de réactualiser le script avant chaque exécution s’il a été modifié entre temps. Sinon GIMP ne prendra pas en compte, dans la session cours, les modifications effectuées. Pour cela, après chaque modification du script, enregistrer le script modifié dans le répertoire «C:/ Program Files/ GIMP/ lib/ gimp/ 2.0/ share/ gimp/ 2.0/ scripts» puis cliquer « Filtres/ Script-Fu/ Actualiser les scripts »

008

Le script produit le résultats suivants pour les tracés avec un pinceau dont la taille s varie entre 1 et 9 pixels, entre les points de coordonnées (5,5) et (5,10).

On constate que :

  • les pinceaux de tailles impaires (1, 3, 5, 7 …) effectuent des tracés de même taille et les pinceaux de tailles paires effectuent des tracés dont la taille est impaire et supérieure (ou inférieure).de 1 pixel à la taille du pinceau ;
  • dans le trait effectué par un pinceau, la ligne du milieu est celle qui correspond à l’abscisse et à l’ordonnée prise en compte lors de l’exécution de l’instruction gimp-pencil.

;----couleur et épaisseur du pinceau modifiables----
(gimp-context-set-foreground '(255 0 0)); couleur rouge
(gimp-context-set-brush-size 1) ; épaisseur du pinceau en pixels (s=1)
;----------------------
(aset maligne 0 5) ; x point 1
(aset maligne 1 5) ; y point 1
(aset maligne 2 5) ; x point 2
(aset maligne 3 10) ; y point 2
(gimp-pencil inLayer n maligne ) ; tracé entre les 2 points<

009

Compte ten ude ces éléments, il est facile de dessiner toutes sortes de cadres sur la periphérie des images sans modifier la taille de ces images, à l’aide de pinceaux de tailles impaires.

Télécharger le code source du script : ligne.scm

Dessiner un cadre bicolore de 1+1 pixels

Soit L et H la largeur et la hauteur de l'image en pixels. Pour dessiner sur cette image un cadre noir extérieur de 1 pixel de largeur accolé à un cadre intérieur blanc de 1 pixels de largeur, il suffit de passer un pinceau de couleur noire de 1 pixel entre les points (0,0) et (L-1, H-1) et un pinceau de couleur blanche de même largeur entre les points (1,1) et (L-2, H-2).

010

;====================
; Ce script trace un cadre 1+1 sur une image ouverte dans GIMP
; sans modifier les dimensions de cette image
; ce cadre est composé d'une ligne extérieure noire de 1 pixel
; d'épaisseur et d'une ligne intérieure blanche de 1 pixel d'épaisseur
; les deux couleurs sont facilement modifiables
; Auteur : Claude Turrier - juin 2016
;------------------
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;==================
(define (script-fu-cadre1-1 inImage inLayer )
(let*
(
;------- 2 couleurs modifiables----
(couleur_ext '(0 0 0)) ; couleur de la partie extérieure du cadre
(couleur_int '(255 255 255)) ; couleur de la partie intérieure du cadre
;-------------------
(w 0) (h 0) ; largeur et hauteur à prendre en compte pour tracer
(n 10) ; nombre de coordonnées des points constituant le tracé
(moncadre (cons-array 10 'double))
(maHauteur (car (gimp-image-height inImage)))
(maLargeur (car (gimp-image-width inImage)))
)
(gimp-brush-new "mabrosse")
(gimp-brushes-refresh)
(gimp-context-set-brush "mabrosse")
(gimp-context-set-brush-aspect-ratio 0)
;--cadre extérieur noir de 1 pixel d'épaisseur
(gimp-context-set-foreground couleur_ext) ; noir
(gimp-context-set-brush-size 1); 1 pixel
(set! w (- maLargeur 1))
(set! h (- maHauteur 1))
(aset moncadre 0 0) ; x point 1
(aset moncadre 1 0) ; y point 1
(aset moncadre 2 w) ; x point 2
(aset moncadre 3 0) ; y point 2
(aset moncadre 4 w) ; x point 3
(aset moncadre 5 h) ; y point 3
(aset moncadre 6 0) ; x point 4
(aset moncadre 7 h) ; y point 4
(aset moncadre 8 0) ; x point 5
(aset moncadre 9 0) ; y point 5
(gimp-pencil inLayer n moncadre ); tracé dans l'ordre des points
;--cadre intérieur blanc de 1 pixel d'épaisseur
(gimp-context-set-foreground couleur_int) ; blanc
(gimp-context-set-brush-size 1); 1 pixel
(set! w (- maLargeur 2))
(set! h (- maHauteur 2))
(aset moncadre 0 1)
(aset moncadre 1 1)
(aset moncadre 2 w)
(aset moncadre 3 1)
(aset moncadre 4 w)
(aset moncadre 5 h)
(aset moncadre 6 1)
(aset moncadre 7 h)
(aset moncadre 8 1)
(aset moncadre 9 1)
(gimp-pencil inLayer n moncadre )
(gimp-displays-flush)
) ; fin de let*
) ; fin de define

(script-fu-register "script-fu-cadre1-1"
"<Image>/MesScripts/cadre1-1"
"----------------"
"Tracer un cadre 1+1 sur une image"
"Claude Turrier"
"2016"
"---------------"
SF-IMAGE "inImage" 0
SF-DRAWABLE "inLayer" 0
)

011

Remarque : pour appliquer le script automatiquement à un lot d’images, il suffit d’utiliser, par exemple, le plugin «BIMP» créé par alessandro francesconi.
L’installation et l’utilisation de ce plugin sont décrits dans la page GIMP - Traitement par lot

Télécharger le code source du script : cadre1-1.scm

Dessiner un cadre bicolore de 2+2 pixels

Pour dessiner sur une image un cadre noir extérieur de 2 pixels de largeur accolé à un cadre intérieur blanc de 2 pixels de largeur, il suffit de passer un pinceau de couleur blanche de 3 pixels entre les points (1,1) et (L-3, H-3) puis par dessus un pinceau de couleur noire de même largeur entre les points (0,0) et (L-1, H-1).

015

; ===============
; Ce script trace un cadre 2+2 sur une image ouverte dans GIMP
; sans modifier les dimensions de cette image
; ce cadre est composé d'une ligne extérieure noire de 2 pixels
; d'épaisseur et d'une ligne intérieure blanche de 2 pixels d'épaisseur
; les deux couleurs sont facilement modifiables
; Auteur : Claude Turrier - juin 2016
;---------------
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;==============
(define (script-fu-cadre2-2 inImage inLayer )
(let*
(
;---- 2 couleurs modifiables------
(couleur_ext '(0 0 0)) ; couleur de la partie extérieure du cadre
(couleur_int '(255 255 255)) ; couleur de la partie intérieure du cadre
;-------------
(w 0) (h 0) ; largeur et hauteur à prendre en compte pour tracer
(n 10) ; nombre de coordonnées des points constituant le tracé
(moncadre (cons-array 10 'double))
(maHauteur (car (gimp-image-height inImage)))
(maLargeur (car (gimp-image-width inImage)))
)
(gimp-brush-new "mabrosse")
(gimp-brushes-refresh)
(gimp-context-set-brush "mabrosse")
(gimp-context-set-brush-aspect-ratio 0)
;--cadre intérieur blanc de 2 pixels d'épaisseur
(gimp-context-set-foreground couleur_int) ; blanc
(gimp-context-set-brush-size 3); 3 pixels
(set! w (- maLargeur 3))
(set! h (- maHauteur 3))
(aset moncadre 0 2)
(aset moncadre 1 2)
(aset moncadre 2 w)
(aset moncadre 3 2)
(aset moncadre 4 w)
(aset moncadre 5 h)
(aset moncadre 6 2)
(aset moncadre 7 h)
(aset moncadre 8 2)
(aset moncadre 9 2)
(gimp-pencil inLayer n moncadre )
;--cadre extérieur noir de 1 pixel d'épaisseur
(gimp-context-set-foreground couleur_ext) ; noir
(gimp-context-set-brush-size 3); 3 pixels
(set! w (- maLargeur 1))
(set! h (- maHauteur 1))
(aset moncadre 0 0) ; x point 1
(aset moncadre 1 0) ; y point 1
(aset moncadre 2 w) ; x point 2
(aset moncadre 3 0) ; y point 2
(aset moncadre 4 w) ; x point 3
(aset moncadre 5 h) ; y point 3
(aset moncadre 6 0) ; x point 4
(aset moncadre 7 h) ; y point 4
(aset moncadre 8 0) ; x point 5
(aset moncadre 9 0) ; y point 5
(gimp-pencil inLayer n moncadre ); tracé dans l'ordre des points
(gimp-displays-flush)
) ; fin de let*
) ; fin de define

(script-fu-register "script-fu-cadre2-2"
"<Image>/MesScripts/cadre2-2"
"--------------"
"Tracer un cadre 2+2 sur une image"
"Claude Turrier"
"2016"
"-------------"
SF-IMAGE "inImage" 0
SF-DRAWABLE "inLayer" 0
)

013

015

Télécharger le code source du script : cadre2-2.scm.

Dessiner un cadre bicolore de 3+2 pixels

Pour dessiner sur une image un cadre noir extérieur de 3 pixels de largeur accolé à un cadre intérieur blanc de 2 pixels de largeur, il suffit de passer un pinceau de couleur blanche de 3 pixels entre les points (3,3) et (L-4, H-4) puis par dessus un pinceau de couleur noire de même largeur entre les points (1,1) et (L-2, H-2).

016

;=================
; Ce script trace un cadre 3+2 sur une image ouverte dans GIMP
; sans modifier les dimensions de cette image
; ce cadre est composé d'une ligne extérieure noire de 3 pixels
; d'épaisseur et d'une ligne intérieure blanche de 2 pixels d'épaisseur
; les deux couleurs sont facilement modifiables
; Auteur : Claude Turrier - juin 2016
;------------------
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;=================

(define (script-fu-cadre3-2 inImage inLayer )
(let*
(
;------- 2 couleurs modifiables-------
(couleur_ext '(0 0 0)) ; couleur de la partie extérieure du cadre
(couleur_int '(255 255 255)) ; couleur de la partie intérieure du cadre
;------------------
(w 0) (h 0) ; largeur et hauteur à prendre en compte pour tracer
(n 10) ; nombre de coordonnées des points constituant le tracé
(moncadre (cons-array 10 'double))
(maHauteur (car (gimp-image-height inImage)))
(maLargeur (car (gimp-image-width inImage)))
)
(gimp-brush-new "mabrosse")
(gimp-brushes-refresh)
(gimp-context-set-brush "mabrosse")
(gimp-context-set-brush-aspect-ratio 0)
;--cadre intérieur blanc de 2 pixels d'épaisseur
(gimp-context-set-foreground couleur_int) ; blanc
(gimp-context-set-brush-size 3)
(set! w (- maLargeur 4))
(set! h (- maHauteur 4))
(aset moncadre 0 3)
(aset moncadre 1 3)
(aset moncadre 2 w)
(aset moncadre 3 3)
(aset moncadre 4 w)
(aset moncadre 5 h)
(aset moncadre 6 3)
(aset moncadre 7 h)
(aset moncadre 8 3)
(aset moncadre 9 3)
(gimp-pencil inLayer n moncadre )

;--cadre extérieur noir de 3 pixels d'épaisseur
(gimp-context-set-foreground couleur_ext) ; noir
(gimp-context-set-brush-size 3)
(set! w (- maLargeur 2))
(set! h (- maHauteur 2))
(aset moncadre 0 1)
(aset moncadre 1 1)
(aset moncadre 2 w)
(aset moncadre 3 1)
(aset moncadre 4 w)
(aset moncadre 5 h)
(aset moncadre 6 1)
(aset moncadre 7 h)
(aset moncadre 8 1)
(aset moncadre 9 1)
(gimp-pencil inLayer n moncadre )
(gimp-displays-flush)
) ; fin de let*
) ; fin de define

(script-fu-register "script-fu-cadre3-2"
"<Image>/MesScripts/cadre3-2"
"-----------------"
"Tracer un cadre 3+2 sur une image"
"Claude Turrier"
"2016"
"-----------------"
SF-IMAGE "inImage" 0
SF-DRAWABLE "inLayer" 0
)

013

Télécharger le code source du script : cadre3-2.scm.

Dessiner un cadre bicolore de 4+3 pixels

Pour dessiner sur une image un cadre noir extérieur de 3 pixels de largeur accolé à un cadre intérieur blanc de 2 pixels de largeur, il suffit de passer un pinceau de couleur blanche de 3 pixels entre les points (5,5) et (L-6, H-6) puis un pinceau de couleur noire de 5 pixel de largeur entre les points (1,1) et (L-2, H-2).

017

;================
; Ce script trace un cadre 4+3 sur une image ouverte dans GIMP
; sans modifier les dimensions de cette image
; ce cadre est composé d'une ligne extérieure noire de 4 pixels
; d'épaisseur et d'une ligne intérieure blanche de 3 pixels d'épaisseur
; les deux couleurs sont facilement modifiables
; Auteur : Claude Turrier - juin 2016
;-----------------
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;================
(define (script-fu-cadre4-3 inImage inLayer )
(let*
(
;------ 2 couleurs modifiables ------
(couleur_ext '(0 0 0)) ; couleur de la partie extérieure du cadre
(couleur_int '(255 255 255)) ; couleur de la partie intérieure du cadre
;------------------
(w 0) (h 0) ; largeur et hauteur à prendre en compte pour tracer
(n 10) ; nombre de coordonnées des points constituant le tracé
(moncadre (cons-array 10 'double))
(maHauteur (car (gimp-image-height inImage)))
(maLargeur (car (gimp-image-width inImage)))
)
(gimp-brush-new "mabrosse")
(gimp-brushes-refresh)
(gimp-context-set-brush "mabrosse")
(gimp-context-set-brush-aspect-ratio 0)
;--cadre intérieur blanc de 3 pixels d'épaisseur
(gimp-context-set-foreground couleur_int) ; blanc
(gimp-context-set-brush-size 3)
(set! w (- maLargeur 6))
(set! h (- maHauteur 6))
(aset moncadre 0 5)
(aset moncadre 1 5)
(aset moncadre 2 w)
(aset moncadre 3 5)
(aset moncadre 4 w)
(aset moncadre 5 h)
(aset moncadre 6 5)
(aset moncadre 7 h)
(aset moncadre 8 5)
(aset moncadre 9 5)
(gimp-pencil inLayer n moncadre )
;--cadre extérieur noir de 4 pixels d'épaisseur
(gimp-context-set-foreground couleur_ext ) ; noir
(gimp-context-set-brush-size 5)
(set! w (- maLargeur 2))
(set! h (- maHauteur 2))
(aset moncadre 0 1)
(aset moncadre 1 1)
(aset moncadre 2 w)
(aset moncadre 3 1)
(aset moncadre 4 w)
(aset moncadre 5 h)
(aset moncadre 6 1)
(aset moncadre 7 h)
(aset moncadre 8 1)
(aset moncadre 9 1)
(gimp-pencil inLayer n moncadre )
(gimp-displays-flush)
) ; fin de let*
) ; fin de define
(script-fu-register "script-fu-cadre4-3"
"<Image>/MesScripts/cadre4-3"
"---------------"
"Tracer un cadre 4+3 sur une image"
"Claude Turrier"
"2016"
"---------------"
SF-IMAGE "inImage" 0
SF-DRAWABLE "inLayer" 0
)

014

Télécharger le code source du script : cadre4-3.scm.

En utilisant cette méthode et en modifiant le script, il est facile de généraliser à des cadres variés en nombres, en épaisseurs et en couleurs.