GIMP Script-fu - Dessiner des pixels sur une image


La page GIMP Initiation au Script-Fu montre comment :
• Utiliser la console Script-fu pour se documenter et tester des instructions script-fu ;
• Ecrire d'un script avec le Bloc-Notes ;
• Placer ce script dans le répertoire approprié ;
• Utiliser de ce script avec GIMP.

La présente page va plus loin et montre comment dessiner automatiquement des pixels sur une image à l'aide d'un script. Cette image peut être une image nouvelle, créée avec GIMP, ou une image existante enregistrée dans un fichier de format quelconque (jpg, png, tiff ou bmp...) et ouverte dans GIMP. L'exemple ci-après est facilement généralisable. Il montre comment dessiner deux pixels rouges aux points de coordonnées x,y égales à (2,2) et (2,3) et deux pixels vertss aux points de coordonnées 3,2) et (3,3) sur une image .png ouverte dans GIMP.

001

Ecrire et enregistrer le script

Pour pouvoir réaliser ce travail, écrire le script suivant avec le Bloc-Notes, le sauvegarder avec le nom «dessin.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 "Mon Image" 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 qu’un pixel RVBA est défini à l’aide d’un tableau de 4 octets.
  • Les deux lignes suivantes consistent à créer un nouveau calque transparent nommé moncalque qui est ajouté à l’image en cours. Ces deux instructions réalisent le même travail que celui effectué à l'aide de l'option de menu «Calque/Nouveau calque» de GIMP.
  • La partie suivante consiste à dessiner les 4 pixels sur le calque transparent qui a été ajouté à l’image en cours.
  • La valeur rvba=(255,0,0,255), c’est à dire rouge, est tout d’abors attribuée à la variable «monpixel» et deux pixels de couleur rouge sont ainsi dessinés au points x,y de coordonnées (2,2) et (2,3) . Puis la valeur rvba=(0,255,0,255), c’est à dire vert, est attribuée à la variable «monpixel» et deux pixels de couleur verte sont ainsi dessinés au points x,y de coordonnées (3,2) et (3,3).
  • L’instruction «(gimp-image-flatten inImage)» consiste à applatir l’image, c’est à dire à fusionner le calque créé (ainsi que son contenu) avec l’image en cours. Cette opération correspond à l’option de menu «Image/Applatir l’image» de GIMP.
  • La partie script-fu-register permet de faire enregistrer le script par Gimp. L’instruction «" /MesScripts/dessin"» indique à GIMP que le script doit être accessible depuis la fenêtre principale de Gimp avec l’option de menu «MesScripts/dessin».

;-------------------
; Ce script permet de dessiner des pixels sur une image ouverte dans GIMP
; Auteur : Claude Turrier - 28 mai 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-dessin inImage )
;--------Déclarer les variables---
(let* ( (moncalque 0) (monpixel (cons-array 4 'byte)))
;------- Créer un nouveau calque transparent et l'ajouter à l'image en cours
(set! moncalque (car (gimp-layer-new inImage 200 200 RGBA-IMAGE "Stain" 100 NORMAL-MODE)))
(gimp-image-insert-layer inImage moncalque 0 0)
;------ Dessiner les pixels sur le calque transparent ajouté à l'image en cours ------
(aset monpixel 0 255) ;rouge=255
(aset monpixel 1 0) ;vert=0
(aset monpixel 2 0) ;bleu=0
(aset monpixel 3 255) ;alpha=255
(gimp-drawable-set-pixel moncalque 2 2 4 monpixel)
(gimp-drawable-set-pixel moncalque 2 3 4 monpixel)
(aset monpixel 0 0) (aset monpixel 1 255) (aset monpixel 2 0) (aset monpixel 3 255) ;rgba=(0,255,0,255)
(gimp-drawable-set-pixel moncalque 3 2 4 monpixel)
(gimp-drawable-set-pixel moncalque 3 3 4 monpixel)
;------ Aplatir l'image ---------
(gimp-image-flatten inImage)
) ; fin de let*
) ; fin de define
;----------------------Faire enregistrer le script par Gimp-----------------------------
(script-fu-register "script-fu-dessin"
"<Image>/MesScripts/dessin"
"-------------------------------"
"Dessine des pixels sur une image"
"Claude Turrier"
"2016"
"-------------------------------"
SF-IMAGE "Mon Image" 0
)

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

Appliquer le script à une image

Ouvrir une image dans GIMP en cliquant l’option de menu «Fichier/Ouvrir».

002

Cliquer l'option de menu «MesScripts/dessin» pour appliquer le script à cette image.

003

Passer en zoom 800 pour constater que les pixels copiés sur l’image ne sont pas visibles dans la fenêtre de Gimp. Cela provient du fait que l’affichage de l’image en cours n’a pas été actualisé dans la fenêtre. Pour voir les pixels copiés depuis la fenêtre de GIMP, il suffit de cliquer l’œil situé à gauche de l’image dans la boîte des calques (rappel : pour faire apparaître la boîte des calques avec Gimp 2.8, il faut cliquer l’option de menu «Fenêtres/Fenêtres ancrables/Calques »).

004

Cliquer une deuxième fois cette zone.

005

L'affichage du contenu de la fenêtre est alors actualisé et les pixels ajoutés à l'image sont visibles à l'écran.

006

Il ne reste plus qu’à sauvegarder l’image modifiée avec un nom différent de celui de l’image de départ afin de na pas effacer cette dernière.

Appliquer le script à un lot d’images

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

Soit, par exemple, un lot de 5 fichiers images nommées «1.jpg» à «5.jpg» placées dans un répertoire «D:\source» et soit un répertoire «D:\destination» vide.

007

Ouvrir BIMP en cliquant l’option de menu «Fichier/Batch Image Manipulation»

.

008

Cliquer les trois boutons

  • «Ajouter des images» (choisir l’option «Ajouter des dossiers») puis choisir le dossier «D:\source»
  • «destination» puis choisir le dossier «D:\destination»
  • «Ajouter», choisir l’option «Autres procédures Gimp»…puis choisir le script «script-fu-dessin»

009

Cliquer le bouton «Appliquer».
Le script effectue le travail. Une fois celui-ci terminé, le nombre d’erreurs éventuelles est affiché dans la barre de progression verte. Dans le cas présent il n’y a pas d’erreurs. Tout s’est bien passé.

010

Explorer le répertoire «D:\destination» pour vérifier qu’il contient bien une copie de toutes les images dotées des dessins de pixels réalisés.

011

Améliorer le script pour dessiner un cadre

Le script suivant permet de dessiner un cadre extérieur noir de un pixel, entouré d’un cadre intérieur blanc de un pixel, à la périphérie d’une image ouverte ou créée dans GIMP.

012

Ce type de cadre produit met en valeur de façon sobre et esthétique une image placée sur un fond blanc (sur le fond blanc d’une page web par exemple).
Pour obtenir un effet comparable avec une couleur de fond de page quelconque, il suffit de choisir une couleur de pixel qui se détache bien du fond, pour le cadre extérieur, et la couleur du fond pour le cadre intérieur.
Par exemple pour une image placée sur un fond de page noir, pour produire un bel effet, il suffit d’utiliser la couleur blanche pour le cadre extérieur et la couleur noire pour le cadre intérieur.

013

;---------
; Ce script permet de dessiner un cadre noir-blanc sur une image ouverte dans GIMP
; Auteur : Claude Turrier - 28 mai 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.
;--------
;----- Ecrire la fonction principale du script ------
(define (script-fu-cadrenoirblanc inImage )
;---- Définir les variables utilisées -------
(let* ( (moncalque 0) (w 0) (h 0) (monpixel (cons-array 4 'byte))
(maHauteur (car (gimp-image-height inImage))) (maLargeur (car (gimp-image-width inImage))) )
;-------- Créer un nouveau calque transparent et l'ajouter à l'image en cours---
(set! moncalque (car (gimp-layer-new inImage maLargeur maHauteur RGBA-IMAGE "MonCalque" 100 NORMAL-MODE)))
(gimp-image-insert-layer inImage moncalque 0 0)
;--------- Dessiner le cadre noir (extérieur) sur le calque transparent ajouté à l'image en cours-------
(aset monpixel 0 0) (aset monpixel 1 0) (aset monpixel 2 0) (aset monpixel 3 255) ;rvba=(0,0,0,255)
(gimp-drawable-set-pixel moncalque 0 0 4 monpixel)
(set! w (- maLargeur 1))
(while (> w 0) (gimp-drawable-set-pixel moncalque w 0 4 monpixel) (set! w (- w 1)) ) ; fin
(set! w (- maLargeur 1))
(set! h (- maHauteur 1)) (while (> w 0) (gimp-drawable-set-pixel moncalque w h 4 monpixel) (set! w (- w 1)) ) ; fin
(set! h (- maHauteur 1))
(while (> h 0) (gimp-drawable-set-pixel moncalque 0 h 4 monpixel) (set! h (- h 1)) ) ; fin
(set! w (- maLargeur 1))
(set! h (- maHauteur 1))
(while (> h 0) (gimp-drawable-set-pixel moncalque w h 4 monpixel) (set! h (- h 1)) ) ; fin
;----------- Dessiner le cadre blanc(intérieur) sur le calque transparent ajouté à l'image en cours ------------
(aset monpixel 0 255) (aset monpixel 1 255) (aset monpixel 2 255) (aset monpixel 3 255) ; rvba=(255,255,255,255)
(gimp-drawable-set-pixel moncalque 1 1 4 monpixel)
(set! w (- maLargeur 2))
(while (> w 1) (gimp-drawable-set-pixel moncalque w 1 4 monpixel) (set! w (- w 1)) ) ; fin
(set! w (- maLargeur 2))
(set! h (- maHauteur 2))
(while (> w 1) (gimp-drawable-set-pixel moncalque w h 4 monpixel) (set! w (- w 1)) ) ; fin
(set! h (- maHauteur 2))
(while (> h 1) (gimp-drawable-set-pixel moncalque 1 h 4 monpixel) (set! h (- h 1)) ) ; fin
(set! w (- maLargeur 2))
(set! h (- maHauteur 2))
(while (> h 1) (gimp-drawable-set-pixel moncalque w h 4 monpixel) (set! h (- h 1)) ) ; fin
;------- Aplatir l'image afin de fusionner le calque ajouté (contenant les pixels) avec le calque contenant l'image -
(gimp-image-flatten inImage)
;----- Placer les parenthèses fermantes -------
) ; fin de let*
) ; fin de define
;----- Enregistrer le script par Gimp ------
(script-fu-register "script-fu-cadrenoirblanc"
"<Image>/MesScripts/cadrenoirblanc"
"-------- --"
"Dessine des pixels sur une image"
"Claude Turrier"
"2016"
"------- ---"
SF-IMAGE "Mon Image" 0
)

Les variables utilisée sont :

  • nonCalque : pour ranger l’identificateur ID du nouveau calque créé qui est ajouté à l’image en cours ;
  • maLargeur et maHauteur : pour conserver en mémoire la largeur et la hauteur en pixels de l’image en cours ;
  • w et h : pour initialiser ces variables de boucle avec les valeurs de largeur et de hauteur en pixels de l’image en cours ;
  • monpixel : pour fixer la couleur à utiliser.

Pour les boucles while, il faut prendre en compte le fait que pour une largeur et une hauteur d’image de 600x400, par exemple, les coordonées des pixels de cette image varient de 0 à 599 pour la hauteur et de 0 à 399 pour la largeur. Donc pour dessiner le cadre extérieur, les boucles doivent balayer de 0 à maLargeur-1 et de 0 à maHauteur-1. Pour dessiner le cadre extérieur, elles doivent balayer de 0 à maLargeur-2 et de 0 à maHauteur-2.

Les pixels (0,0) et (1,1) ne sont pas, dans le script, pris en compte dans les boucles while mais sont dessinés séparément à l’aide des instructions (gimp-drawable-set-pixel moncalque 0 0 4 monpixel) et (gimp-drawable-set-pixel moncalque 1 1 4 monpixel)

Rappel : Il ne faut pas oublier de cliquer sur l’œil situé à gauche de l’image dans la boîte des calques pour voir le cadre copié sur l’image dans la fenêtre de GIMP ( actualisation de l’affichage).

L’application du filtre à un lot d’image peut s’effectuer à l’aide de «BIMP», en suivant la méthode indiquée ci-dessus,. Cela prend seulement quelques secondes.

014

Il est facile de modifier le script pour tracer non pas une ligne extérieure noire et une ligne intérieure blanche de 1 pixel de largeur chacune (c'est à dire une largeur totale de cadre de 2 pixels) mais, par exemple, deux lignes extérieures noires et deux lignes intérieures blanches de 1 pixel de largeur chacune (donnant ainsi une largeur totale de cadre de 4 pixels) comme sur l'image suivante.

015

Télécharger le code source des scripts : cadrenoirblanc.scm (cadre noir blanc de 2 pixels d'épaisseur) et cadrenoirblanc2.scm (cadre noir blanc de 4 pixels d'épaisseur).