Dopo aver presentato diversi scripts per l’ottimo GIMP, credo sia giunta l’ora di fare un po di chiarezza su cosa siano queste “estensioni”, ma soprattutto come funzionano e come possiamo crearne di nuove con le nostre mani.
Siete armati di GIMP, un editor di testo possibilmente che supporti il sintax highlight del linguaggio Scheme (gedit, kate, o notepad++ vanno benissimo), allora possiamo cominciare…
Introduzione a Scheme
Detto in due parole, gli script-fu sono appunto scripts, solitamente scritti in linguaggio Scheme, che contengono al loro interno chiamate a funzioni di GIMP.
Prima di vedere un esempio dettagliato di script è necessario spendere due parole sul linguaggio Scheme che ci apprestiamo ad usare per scrivere il nostro script.
Scheme è un linguaggio funzionale derivato dal più famoso Lisp che, al contrario di molti altri linguaggi, utilizza sia per le operazioni che per l’invocazione di funzioni la notazione prefissa. In questo tipo di notazione l’operatore o la funzione precede gli argomenti; ad esempio se volessimo eseguire una semplice operazione matematica di addizione, come 1 + 2 in Scheme la sintassi è:
(+ 1 2)
Questo concetto si applica in modo simile anche all’invocazione di funzioni, la cui sintassi risulta essere (func arg1 arg2 … argN), per esempio, supponiamo di avere una funzione “saluta” che accetta come parametri una variabile contenente il nome ed una il cognome di una persona, per invocare tale funzione in Scheme useremo la seguente sintassi:
(saluta “Mario” “Rossi”)
Anche se all’inizio questo tipo di notazione può apparire ostica, dopo aver scritto poche righe di codice ci si è già abituati.
Una caratteristica più ostica invece della sintassi di questo linguaggio è il fatto che qualsiasi espressione (non inteso solo nel termine matematico, ma anche istruzioni, chiamate a funzioni, etc. insomma, quelli che sono normalmente definiti statement) sono racchiuse fra parentesi tonde.Detto così può anche non sembrare un gran problema ed in effetti non lo è per espressioni semplici come gli esempi precedenti, ma lo diventa quando si cominciano ad avere più chiamate a funzioni unite ad operazioni aritmetiche o assegnamenti o letture di elementi di liste, il tutto nidificato più volte.
Ora che abbiamo presente questi concetti, possiamo introdurre alcuni concetti fondamentali. Iniziamo dalla dichiarazione ed assegnazione di variabili che avviene mediate uso delle funzioni let e set. In particolare let consente di dichiarare una variabile locale, per cui il corrispettivo della seguente dichiarazione di variabili in, ad esempio, Java:
int var1 = 10;
int var2 = 20;
in Scheme sarà qualcosa del tipo:
(let* ((var1 10) (var2 20)))
In questo modo abbiamo dichiarato due variabili va1 e var2 e gli abbiamo assegnato dei valori iniziali interi rispettivamente di 10 e 20. Per assegnare, invece, un nuovo valore ad una variabile precedetemene dichiarata useremo l’istruzione set!, ad esempio per assegnare il valore 100 alla variabile var1 precedentemente dichiarata scriveremo:
(set! var1 100)
Naturalmente come per qualsiasi linguaggio si potrebbe andare avanti ore a descriverne struttura e sintassi, ma per i nostri scopi queste poche conoscenze sono più che sufficienti. vediamo quindi come creare uno script per GIMP.
Shadowed Thumbnails: uno script di esempio
Fondamentalmente uno script-fu per GIMP è composto da una parte di codice Scheme contenente le operazioni da far compiere al buon Wilbur e da una parte contenente le direttive per creare una voce in un menù e per definire la struttura di una eventuale finestra di selezione dei parametri da passare allo script. L’esempio che andremo a vedere è molto semplice, lo script non fa altro che prendere l’immagine attiva, ad esempio questa:
e crearne una thumbnail con un semplice effetto ombreggiato, così:

- Risultato dell’applicazione dello script
Vediamo ora la funzione principale dello script che si occupa di applicare le trasformazioni all’immagine per ottenere la thumbnail (non spaventatevi, sotto vengono spiegati i passi in dettaglio):
;Declare the script’s main function
(define (script-fu-create-thumb theImage
theLayer
thumbWidth
thumbHeight
shadowColor
backgroundColor
);Initiate some variables
(let* (
(layerBackground 0)
(layerShadow 0)
(innertWidth (- thumbWidth 10))
(innertHeight (- thumbHeight 10))
);Start an undo group so the process can be undone with one undo
(gimp-image-undo-group-start theImage);Select none
(gimp-selection-none theImage);Resize image to thumb size
(gimp-image-scale-full theImage innertWidth innertHeight 2); Change background color
(gimp-context-set-background shadowColor); Create shadow layer
(set! layerShadow (car (gimp-layer-new theImage innertWidth innertHeight 0 “Shadow layer” 100.0 0)));Add shadow layer to image
(gimp-image-add-layer theImage layerShadow -1); Paint shadow layer
(gimp-drawable-fill layerShadow BG-IMAGE-FILL); Move layer below
(gimp-image-lower-layer-to-bottom theImage layerShadow); Rezize image
(gimp-image-resize theImage thumbWidth thumbHeight 5 5); Change background color
(gimp-context-set-background backgroundColor); Create shadow layer
(set! layerBackground (car (gimp-layer-new theImage thumbWidth thumbHeight 0 “Background layer” 100.0 0)));Add shadow layer to image
(gimp-image-add-layer theImage layerBackground -1); resize shadow layer
(gimp-layer-resize-to-image-size layerShadow); Paint shadow layer
(gimp-drawable-fill layerBackground BG-IMAGE-FILL); Move layer below
(gimp-image-lower-layer-to-bottom theImage layerBackground); Blur shadow
(plug-in-gauss 1 theImage layerShadow 7 7 1);Finish the undo group for the process
(gimp-image-undo-group-end theImage);Ensure the updated image is displayed now
(gimp-displays-flush)
)
)
Dopo la dichiarazione della firma della funzione principale (notare l’uso della keyword define per dichiarare una nuova funzione):
(define (script-fu-create-thumb theImage
theLayer
thumbWidth
thumbHeight
shadowColor
backgroundColor
)
in cui vengono passati come parametri rispettivamente: il riferimento all’immagine attiva al momento dell’invocazione dello script, il riferimento al layer attivo al momento dell’invocazione dello script, la larghezza e l’altezza in pixels della thumbnail che si desidera generare, il colore dell’ombra e il colore di sfondo della thumbnail, in poche parole lo script non fa altro che:
- Definire alcune variabili locali in questo modo:(let* (
(layerBackground 0)
(layerShadow 0)
(innertWidth (- thumbWidth 10))
(innertHeight (- thumbHeight 10))
)In pratica si definiscono due variabili non inizializzate layerBackground e layerShadow a cui in seguito saranno assegnati i riferimenti ai livelli s sfondo ed ombreggiatura creati; inoltre sono dichiarate due variabili innertWidth ed innertHeight ed inizializzate rispettivamente con i valori della larghezza ed altezza della thumbnail ridotti di 10 pixels ciascuno.
- Definisce un nuovo gruppo per l’undo in modo che tutte le operazioni compiute sull’immagine dallo script possano essere annullate con un solo comando. Inoltre rimuove qualsiasi selezione attiva dall’immagine:
;Start an undo group so the process can be undone with one undo
(gimp-image-undo-group-start theImage);Select none
(gimp-selection-none theImage)Come spiegato nella parte introduttiva vengono invocate due funzioni della libreria di GIMP passandovi come parametro il riferimento all’immagine attiva nella forma (nome_funzione parametro)
- Ridurre (scalare) l’immagine in modo che sia 10 pixel minore delle dimensioni specificate per la thumbnail sia in larghezza che in altezza:
;Resize image to thumb size
(gimp-image-scale-full theImage innertWidth innertHeight 2) - Crea un nuovo livello delle stesse dimensioni dell’immagine scalata per generare l’effetto ombreggiato. Una volta creato il nuovo livello questo viene aggiunto all’immagine, viene impostato il colore specificato per l’ombra come colore di sfondo e lo si usa per riempire uniformemente il nuovo livello creato; infine sposta il nuovo livello creato sotto il livello principale:
; Create shadow layer
(set! layerShadow (car (gimp-layer-new theImage innertWidth innertHeight 0 “Shadow layer” 100.0 0)));Add shadow layer to image
(gimp-image-add-layer theImage layerShadow -1); Change shadow color
(gimp-context-set-background shadowColor); Paint shadow layer
(gimp-drawable-fill layerShadow BG-IMAGE-FILL); Move layer below
(gimp-image-lower-layer-to-bottom theImage layerShadow)La funzione (gimp-layer-new theImage innertWidth innertHeight 0 “Shadow layer” 100.0 0) crea un nuovo livello e ritorna una struttura dati lista il cui primo elemento è il riferimento al nuovo livello creato. La keyword car non fa altro che estrapolare il primo elemento dalla lista, il quale è assegnato alla variabile layerShadow mediate l’uso di set!
- So script procede poi con il ridimensionamento dell’immagine alle dimensioni richieste per la thumbnails. I pixel vuoti che circondano l’immagine saranno necessari per visualizzare l’effetto ombra:
; Rezize image
(gimp-image-resize theImage thumbWidth thumbHeight 5 5) - In modo analogo a come si è proceduto per creare e riempire il livello dell’ombra, si procede per generare il background dell’immagine, riempirlo con il colore di sfondo ed infine spostarlo sotto tutto lo stack dei livelli:
; Create background layer
(set! layerBackground (car (gimp-layer-new theImage thumbWidth thumbHeight 0 “Background layer” 100.0 0)));Add background layer to image
(gimp-image-add-layer theImage layerBackground -1); Change background color
(gimp-context-set-background backgroundColor); Paint background layer
(gimp-drawable-fill layerBackground BG-IMAGE-FILL); Move layer below
(gimp-image-lower-layer-to-bottom theImage layerBackground) - L’ultima operazione eseguita è l’applicazione di una sfumatura gaussiana con un valore di 6 pixel al livello layerShadow così da ottenere l’effetto ombreggiato tutto attorno all’immagine. Prima però di applicare la sfumatura all’ombra è necessario ridimensionare il livello che la contiene in modo da riempire completamente l’area dell’immagine, altrimenti le sfumature supererebbero le dimensioni del livello e non sarebbero visibili:
; Resize shadow layer
(gimp-layer-resize-to-image-size layershadow); Blur shadow
(plug-in-gauss 1 theImage layerShadow 6 6 1) - Infine si chiude il gruppo aperto all’inizio per l’annullamento dell’applicazione dello script e, tramite invocazione della funzione di GIMP (gimp-displays-flush), ci si assicura che l’immagine visualizzata sia aggiornata con tutte le modifiche applicate:
;Finish the undo group for the process
(gimp-image-undo-group-end theImage);Ensure the updated image is displayed now
(gimp-displays-flush)
Ora che abbiamo creato la funzione principale dello script-fu non ci resta da fare altro che creare una voce nei menù di GIMP per invocare tale script, cosa che ci apprestiamo a fare.
Resistrare lo script
Per essere invocato il nostro script richiede alcuni parametri, quali le dimensioni della thumbnail e i colori dell’ombra e dllo sfondo. Visto e considerato che spesso le anteprime ridotte di immagini più grandi sono utilizzate per le pubblicazioni sul web, la voce di menù utile per invocare lo script che abbiamo creato sarà posta nel menu Filtri -> Web -> Shadowed Thumbnail… come in figura:

Quando un utente fa click sulla voce di menù dovrà apparire una finestra per l’immissione dei parametri dello script come la seguente:

Nonostante questo possa sembrare complicato, l’operazione di registrazione dello script è semplice e si ottiene con poche righe di codice:
;Add script menu voice
(script-fu-register “script-fu-create-thumb”
_”<Image>/Filters/Web/Shadowed thumbnail…”
“Creates a thumbnail of an image with a shadow effect.”
“Tommaso Frazzetto”
“Copyright 2009, Tommaso Frazzetto”
“30 March 2009″
“*”
SF-IMAGE “Image” 0
SF-DRAWABLE “Drawable” 0
SF-ADJUSTMENT _”Thumbnails Width” ‘(240 5 10000 1 1 0 1)
SF-ADJUSTMENT _”Thumbnails Height” ‘(180 5 10000 1 1 0 1)
SF-COLOR _”Shadow Color” ‘(0 0 0)
SF-COLOR _”Background Color” ‘(255 255 255)
)
Allora, andiamo con ordine, la funzione script-fu-register registra il nostro script fra quelli disponibili in GIMP. I parametri passati alla funzione sono i seguenti:
- “script-fu-create-thumb”: definisce il nome della funzione principale dello script che sarà invocata alla chiusura della finestra delle impostazioni dello script ed a cui saranno passati i parametri definiti successivamente.
- _”<Image>/Filters/Web/Shadowed thumbnail…”: definisce il percorso ed il nome della voce di menù che l’utente utilizzerà per invocare lo script.
- “Creates a thumbnail of an image with a shadow effect.”: testo contenuto nel tooltip visualizzato quando l’utente si ferma con il cursore sopra la voce di menù
- “Tommaso Frazzetto”: l’autore dello script
- “Copyright 2009, Tommaso Frazzetto”: copyright dello script (vedi mai che me lo rubino
) - “30 March 2009″: data di creazione dello script
- “*”: il tipo di immagine su cui lo script è in grado di operare, ad esempio: RGB, RGBA, GRAY, GRAYA. Nel nostro caso l’asterisco indica che lo script funziona con qualsiasi tipo di immagine.
- SF-IMAGE “Image” 0: riferimento all’immagine attiva al momento dell’invocazione dello script.
- SF-DRAWABLE “Drawable” 0: riferimento al layer attivo al momento dell’invocazione dello script.
- SF-ADJUSTMENT _”Thumbnail Width” ”(240 5 10000 1 1 0 1) : Aggiunge alla finestra dei parametri da visualizzare all’utente una casella di selezione numerica che rappresenta la larghezza della thumbnail da creare. La stringa “Thumbnail Width” è l’etichetta che descrive il valore contenuto nella casella di testo. La notazione ‘(val1 val2 val3 … valN) definisce una lista in Scheme. Il primo valore della lista (240) rappresenta il valore predefinito per la larghezza, il secondo ed il terzo parametro (5 10000) rappresentano i limiti inferiore e superiore che il valore può assumere, il quarto ed il quinto parametro rappresentano gli step di incremento del valore sia se si modifica il valore di controllo col mouse e sia con i tasti page key, il sesto valore rappresenta il numero di cifre decimali dopo la virgola (nel nostro caso è un intero e quindi ha 0 decimali), L’ultimo parametro rappresenta il tipo di controllo da visualizzare: 0 visualizza uno slider, 1 uno spinner.
- SF-ADJUSTMENT _”Thumbnails Height” ‘(180 5 10000 1 1 0 1): come il parametro precedente. definisce l’altezza della thumb.
- SF-COLOR _”Shadow Color” ‘(0 0 0): Mostra una casella di selezione del colore per l’ombra da applicare alla thumbnail. ‘(0 0 0) rappresenta una terna RGB che definisce il colore predefinito della casella (nel caso specifico il nero).
- SF-COLOR _”Background Color” ‘(255 255 255): come per il parametro precedente, definisce il colore dello sfondo della thumbnail. Predefinito è il bianco.
Installare lo script
Ora che il nostro script è completo possiamo salvarlo in un file con estensione .scm per poi copiare il file all’interno della cartella degli script di GIMP. Chiudiamo quindi tutte le eventuali istanze di GIMP in esecuzione e copiamo il nostro script nella cartella locale degli script per installare lo script esclusivamente per il nostro utente:
]#cp shadowed-thumb.scm ~/.gimp-2.6/scripts/
oppure, nel caso volessimo renderlo disponibile per tutti gli utenti:
]#sudo cp shadowed-thumb.scm /usr/share/gimp/2.0/scripts/
Una volta fatto questo basterà riavviare GIMP, aprire una nuova immagine e selezionare la voce Filtri -> Web -> Shadowed Thumbnail… per avviare lo script.
NOTA: mentre si scrive un nuovo script, spesso si ha la necessità di modificarlo per apportare cambiamenti o correzioni. In tal caso non è necessario chiudere e riavviare GIMP ad ogni modifica, ma sarà sufficente, dopo aver salvato le modifiche al file dello script, fre click su Filtri -> Script-Fu -> Rinfresca gli script in questo modo si obbliga GIMP a rileggere tutti gli script. In caso che dopo questa operazione la voce di menù relativa al vostro script non apaia nella corretta locazione significa, probabilemnte, che il vostro script contiene errori o la registraszione dello script contiene errori.
Risorse e Riferimenti
Quanti di voi hanno avuto la forza di leggermi fin qui, probabilmente a questo punto si stanno chiedendo dove sia possibile trovare un reference delle funzioni disponibili per scrivere i nostri script. Girovagando per la rete un vero e proprio reference non l’ho trovato, ma c’è un interessantissimo tuttorial sulla scrittura di script in GIMP all’interno della documentazione ufficiale di GIMP. Ad essere sincero non ho neppure cercato eccessivamente in rete in quanto, selezionando la voce Filtri -> Script-Fu -> Console ed, una volta aperta la console facendo click sul bottone “Scorri…” ci si trova davanti un ottimo reference con tanto di filtro di ricerca per tuttte le funzioni predefinite disponibili, come in figura:
Inoltre sono disponibili i sorgenti dello script di esempio rilasciati a scopo dimostrativo a corredo del tutorial sotto licenza GNU Public License (di cui si trova copia all’interno dell’archivio) e scaricabili dal link seguente:
Shadowed-Thumb: sorgenti dello script illustrato nel tutorial
I lo stesso archivio si può reperire anche nel GIMP Plugin Registry assieme a centinaia di altri plugins e scripts. E’ molto utile, per iniziare a scrivere estensioni per gimp, studare il codice di estensioni già esistenti e ben funzionanti.
Nella speranza che questo breve tutorial possa essere di aiuto a qualcuno per cominciare ad orientarsi nello scripting in GIMP, vi auguro buone sperimentazioni






marzo 30th, 2009 at 19:34
Ottima guida come al solito! Vedrò di fare uno script per metterla alla prova!
marzo 31st, 2009 at 09:42
Grazie, sei sempre troppo gentile.
Per i primi esperimenti ti consiglio di prestare attenzione alle parentesi ed aiutarti con l’indentazione del codice. I primi tempi fra l’uso estremo di parentesi tonde e la notazione prefissa si rischia di perdere un sacco di tempo per una semplice parentesi mancante.
marzo 31st, 2009 at 22:12
Ottimo lavoro, grazie mille, era proprio ciò che cercavo
aprile 2nd, 2009 at 20:21
Hello, found your plugin at Gimps plugin archive blog, really cool script, i want to learn about this, very useful information my friend, must be published in english, spanish, and more!! peace man.
aprile 3rd, 2009 at 08:57
Thank you much for appreciations. I wrote this tutorial in italian because there are a lot of examples in english on the web, on how to write scripts-fu in GIMP, but I’ve got received other two requests (in addition to your) for the english translation of this tutorial. I plain translate it as soon as I got a bit of free time. For spanish translation I’m sorry: I speak some words of spanish and I understand basic conversation sentences, but I can’t write in that language.