Si continui con il nostro addestramento e si aggiungano delle funzionalità allo script.
Nella lezione precedente si è creata una funzione vuota e la si è registrata in GIMP. In questa lezione si doterà lo script di funzionalità: si vuole creare una nuova immagine, aggiungere il testo immesso dall'utente e ridimensionare l'immagine per contenere esattamente il testo.
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 Sezione 12.9, «Il navigatore delle procedure».
Cominciare creando una nuova immagine. Creare una nuova variabile, theImage
, a cui assegnare il valore restituito dalla funzione interna gimp-image-new
.
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* ( ;definizione delle variabili locali ;creazione di una nuova immagine: (theImageWidth 10) (theImageHeight 10) (theImage (car (gimp-image-new theImageWidth theImageHeight RGB ) ) ) (theText) ;una dichiarazione per il testo ;che creeremo più avanti
Nota: si è utilizzato il valore RGB
per specificare che l'immagine è di tipo RGB. Si sarebbe potuto anche utilizzare il valore 0 ma RGB è più descrittivo, quando si guarda il codice.
Si noti anche che si è presa la testa del risultato della chiamata a funzione. Può sembrare strano perché il database afferma esplicitamente che la funzione restituisce un unico valore: l'ID dell'immagine appena creata. Tuttavia tutte le funzioni di GIMP restituiscono una lista, anche se contenente un unico elemento, perciò è necessario ottenere la testa della lista.
Ora che un'immagine è disponibile, occorre aggiungervi un livello. Chiamare la funzione gimp-layer-new
per creare il livello passando l'ID dell'immagine precedentemente creata (da adesso in poi, invece di elencare l'intera funzione, verranno mostrate solo le linee da aggiungere. Si può osservare lo script completo qui). Poiché si sono dichiarate tutte le variabili locali utilizzate, si chiuderanno tutte le parentesi segnando la fine del blocco di dichiarazione delle variabili:
;crea un nuovo livello per l'immagine: (theLayer (car (gimp-layer-new theImage theImageWidth theImageHeight RGB-IMAGE "layer 1" 100 LAYER-MODE-NORMAL ) ) ) ) ;fine delle nostre variabili locali
Una volta disponibile il nuovo livello occorre aggiungerlo all'immagine:
(gimp-image-insert-layer theImage theLayer 0 0)
Si provi ora a testare il risultato del lavoro svolto fino a questo punto aggiungendo la linea seguente per mostrare la nuova immagine:
(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.
Procedere rimuovendo la riga per visualizzare l'immagine (o la si commenti facendola precedere da un ;
ad inizio linea).
Prima di aggiungere il testo all'immagine occorre impostare i colori di primo piano e di sfondo in modo che il testo abbia il colore selezionato dall'utente. Utilizzare le funzioni gimp-context-set-back/foreground:
(gimp-context-set-background '(255 255 255) ) (gimp-context-set-foreground inTextColor)
Con i colori opportunamente impostati cancellare la spazzatura presente nell'immagine riempiendo l'area con il colore di sfondo:
(gimp-drawable-fill theLayer FILL-BACKGROUND)
Dopo aver pulito l'immagine si è pronti per l'aggiunta del testo:
(set! theText (car (gimp-text-font theImage theLayer 0 0 inText 0 TRUE inFontSize inFont) ) )
Anche se la chiamata della funzione è molto lunga è facile comprenderne il funzionamento esaminando i parametri mentre si fa riferimento alla voce della funzione nel Navigatore delle procedure. Essenzialmente si sta creando un nuovo livello di testo e lo si sta assegnando alla variabile theText
.
Ora che il testo è disponibile si possono richiedere le sue dimensioni e ritagliare l'immagine e il suo livello:
(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)
Ci si potrebbe chiedere che differenza c'è tra un piano disegnabile e un livello. Un piano disegnabile è qualcosa in cui si può disegnare e comprende i livelli ma anche i canali, le maschere, la selezione ecc. Un livello è una specializzazione di un piano disegnabile. Nella maggioranza dei casi, tuttavia, la differenza non è rilevante.
Una volta che l'immagine è pronta si può reinserire la riga per la visualizzazione:
(gimp-display-new theImage)
Save your work, restart GIMP and give your first script a run!
Se si tenta di chiudere una nuova immagine senza aver salvato il file, GIMP chiederà se si vuole salvare il lavoro. La richiesta deriva dal fatto che l'immagine è marcata come modificata o non salvata (dirty flag). Nel caso dello script in oggetto ciò può sembrare una seccatura, se lo si esegue per test e non si cambia nulla nell'immagine prodotta. Perciò, poiché il nostro lavoro è facilmente riproducibile, è utile togliere del tutto detta marcatura di modifica.
Si può azzerare la marcatura di modifica dopo aver mostrato l'immagine:
(gimp-image-clean-all theImage)
Ciò azzererà il contatore delle modifiche, rendendo l'immagine «non modificata».
L'aggiunta di questa linea è una questione di gusti personali. È consigliabile utilizzarla in script che producono nuove immagini in cui i risultati sono banali. Se lo script è molto complicato o se lavora su immagini preesistenti è consigliabile non utilizzare questa funzione.