Magazine Informatica

Come diventare un mago di GIMP: una guida sugli Script-Fu (seconda parte)

Creato il 30 maggio 2013 da Hugor @msdiaz61
gimp logo
In questo corso guidato verranno introdotti i concetti base del linguaggio Scheme, necessari per usare e creare dei comodi script Script-Fu da aggiungere ai propri.
Lo script preso in esame richiede del testo all'utente, e crea una nuova immagine perfettamente dimensionata ad esso.

Si migliorerà lo script in modo da creare dello spazio attorno al testo. In conclusione una serie di suggerimenti per aumentare le proprie conoscenze sugli Script-fu.

[Nota]Nota:
Questo capitolo è stato adattato da un tutorial, scritto per la versione 1 di GIMP, di Mike Terry.

Il primo script Script-Fu.
Serve una pausa? No? Bene, procediamo con la quarta lezione, il primo script Script-Fu.

Creare uno script Text Box.
Una delle operazioni più comuni che si intraprendono in GIMP è la creazione di un rettangolo con del testo per una pagina web, un logo o altro. Tuttavia quando si comincia non si sa quanto far grande l'immagine iniziale. Non si sa quanto spazio occuperà il testo con il font e la dimensione del font che si desidera.

Il maestro di Script-Fu (e lo studente) si accorgeranno subito che questo problema può facilmente essere risolto e automatizzato con Script-Fu.

Si creerà quindi uno script, intitolato Text Box, che crea un'immagine delle dimensioni corrette per contenere una linea di testo immessa dall'utente. Si consentirà inoltre all'utente di scegliere il font, la dimensione del font e il colore del testo.

Modificare e memorizzare gli script.
Fino ad ora si è lavorato nella finestra della console Script-Fu. Adesso si comincerà a modificare file testuali per gli script.

Dove tenere i propri script è una questione di preferenze personali. Se si ha accesso alla directory predefinita degli script di GIMP si possono tenere lì gli script. Tuttavia è preferibile mantenere i propri script in una propria directory personale per tenerli separati dagli script piazzati dall'installazione.

Nella directory .gimp-2.8 che GIMP crea nella directory home dell'utente, si dovrebbe trovare una directory denominata scripts. GIMP controllerà automaticamente nella directory .gimp-2.8 se esiste una directory scripts e aggiungerà gli scripts contenuti in questa directory al database di Script-Fu. Perciò è conveniente usare questa directory per memorizzare i propri script personali.

Lo stretto necessario.
Ogni script Script-Fu definisce almeno una funzione che è la funzione principale dello script. Questa è la funzione dove si fa il lavoro.

Ogni script deve registrarsi nel database delle procedure per poter risultare accessibile a GIMP.

Si definisca dapprima la funzione principale:

        (define (script-fu-text-box inText inFont inFontSize inTextColor))       

Qui viene definita una nuova funzione denominata script-fu-text-box che riceve quattro parametri che poi corrisponderanno a del testo, ad un font, alla dimensione del font e al colore del testo. La funzione è al momento vuota e non fa nulla.

Convenzioni per i nomi.

Le convenzioni sui nomi di Scheme sembrano dare la preferenza a lettere minuscole con trattini, convenzione seguita nel dare il nome alla funzione. Tuttavia ci si è allontanati dalla convenzione con gli argomenti. Si sono preferiti nomi più descrittivi per argomenti e variabili e quindi si è aggiunto il prefisso "in" agli argomenti in modo da distinguerli rapidamente come argomenti passati allo script piuttosto che creati al suo interno. Si è usato il prefisso "the" per variabili definite all'interno dello script.

Fa parte di una convenzione di GIMP di denominare le funzioni degli script script-fu-abc, poiché quando vengono elencate nel database delle procedure sono tutte raggruppate sotto il prefisso script-fu. Ciò aiuta anche a distinguerle dai plug-in.

Registrare la funzione.

Reistrare ora la funzione in GIMP. Ciò si ottiene richiamando la funzione script-fu-register. Quando GIMP legge uno script, esegue questa funzione che registra lo script nel database delle procedure. Si può posizionare questa funzione in ogni parte dello script, ma di solito la si posiziona alla fine, dopo tutto il codice.

Ecco il listato per registrare questa funzione (si chiariranno a breve gli argomenti):

  (script-fu-register
    "script-fu-text-box"                        ;func name
    "Text Box"                                  ;menu label
    "Creates a simple text box, sized to fit\
      around the user's choice of text,\
      font, font size, and color."              ;description
    "Michael Terry"                             ;author
    "copyright 1997, Michael Terry;\
      2009, the GIMP Documentation Team"        ;copyright notice
    "October 27, 1997"                          ;date created
    ""                     ;image type that the script works on
    SF-STRING      "Text"          "Text Box"   ;a string variable
    SF-FONT        "Font"          "Charter"    ;a font variable
    SF-ADJUSTMENT  "Font size"     '(50 1 1000 1 10 0 1)
                                                ;a spin-button
    SF-COLOR       "Color"         '(0 0 0)     ;color variable
  )
  (script-fu-menu-register "script-fu-text-box" "<Image>/File/Create/Text")
      

Se si salvano queste funzioni in un file di testo con estensione .scm all'interno della directory degli script, quindi si seleziona Filtri → Script-Fu → Aggiorna gli script, questo nuovo script comparirà come Filtri → Script-Fu → Text → Text Box.

Se si invoca questo nuovo script naturalmente non succede nulla, ma si possono osservare le richieste di parametri definite quando si registra lo script (ulteriori informazioni più avanti).

Infine, se si richiama il Navigatore di procedure (Aiuto → Navigatore di procedure), si noterà che lo script ora appare nel database.

Passi per la registrazione dello script.

Per registrare lo script in GIMP si richiama la funzione script-fu-register, passando i sette parametri richiesti e aggiungendo gli argomenti dello script insieme con una descrizione e un valore predefinito per ciascun argomento.

Gli argomenti richiesti.

  • Il nome della funzione definita. Questa è la funzione che viene chiamata quando si invoca lo script (il punto di entrata). È obbligatoria perché si possono definire altre funzioni all'interno dello stesso file e GIMP deve sapere quale tra queste funzioni richiamare. Nell'esempio si è definita solo una funzione, text-box, che è stata registrata.
  • La collocazione nel menu dove lo script sarà inserito. L'esatta posizione è specificata come un percorso di file Unix, con <Image> come radice.

    Se lo script non opera su immagini preesistenti (e quindi ne crea di nuove come lo script Text Box), è preferibile inserirlo nel menu della finestra immagine, accessibile tramite la barra del menu immagine, con il clic destro del mouse nella finestra immagine, facendo clic sull'icona del pulsante del menu sull'angolo in alto a sinistra della finestra immagine o premendo F10.

    Se lo script è stato pensato per lavorare su un'immagine in corso di modifica, è preferibile inserirlo nel menu immagine. La parte restante del percorso indica la voce del menu e dei sottomenu. Perciò, registrare lo script Text Box nel sottomenu Text del sottomenu Crea del menu File. (File → Crea → Text → Text Box).

    Si noti che il sottomenu Text del menu File/Crea, non era presente all'inizio: GIMP crea automaticamente i menu inesistenti.

  • Una descrizione dello script che viene visualizzata nel Navigatore delle procedure.
  • Un nome autore (l'autore dello script).
  • Informazioni sul Copyright.
  • La data di creazione dello script o quella della sua ultima revisione.
  • I tipi di immagine su cui lo script opera. Questo argomento può essere uno tra: RGB, RGBA, GRAY, GRAYA, INDEXED, INDEXEDA. Oppure può anche non essere presente del tutto, nel caso si crei una nuova immagine e quindi non risulti applicabile.
Il menu del nostro script.

Il menu del nostro script.

Registrare i parametri dello script.

Dopo aver elencato gli argomenti necessari occorre elencare gli argomenti che corrispondono a quelli necessari al nostro script. Quando si elencano questi argomenti si danno indicazioni sui loro tipi, questo serve per la finestra di dialogo che compare quando l'utente seleziona lo script. Si deve anche fornire un valore predefinito.

Questa sezione del processo di registrazione ha il seguente formato:

Tipo argomento

Descrizione

Esempio

SF-IMAGE

Se lo script opera su un'immagine già aperta, questo dovrebbe essere il primo argomento dopo quelli richiesti. GIMP passa un riferimento all'immagine in questo parametro.

3

SF-DRAWABLE

Se lo script opera su un'immagine aperta questo dovrebbe essere il secondo argomento dopo SF-IMAGE. Si riferisce al livello attivo. GIMP passa un riferimento al livello attivo in questo parametro.

17

SF-VALUE

Accetta numeri e stringhe. Si noti che le virgolette devono essere sottoposte ad escape perciò, in caso di stringhe di testo, è preferibile utilizzare SF-STRING.

42

SF-STRING

Accetta stringhe.

"Del testo"

SF-COLOR

Indica che questo argomento richiede un colore.

'(0 102 255)

SF-TOGGLE

Viene mostrata una casella di scelta per richiedere un valore booleano.

TRUE o FALSE (vero o falso)

Le API dei parametri Script-Fu


[Nota]Nota:

Malgrado il fatto che i precedenti tipi di parametri sono per lo più per la modalità interattiva, ogniuno di essi crea un widget nel pannello di controllo. Si può trovare un elenco di questi parametri con descrizioni e esempi nello script di prova plug-ins/script-fu/scripts/test-sphere.scm distribuito con i sorgenti di GIMP.


Tipo argomento

Descrizione

SF-ADJUSTMENT

Crea un widget di regolazione nella finestra di dialogo.

SF-ADJUSTMENT "etichetta" '(valore inferiore superiore passo_inc pgina_inc cifre tipo)

Elenco argomenti del widget.

Elemento

Descrizione

"etichetta"

Testo stampato prima del widget.

valore

Valore stampato alla partenza.

inferiore / superiore

I valori inferiore / superiore (campo libero).

passo_inc

Incrementa/decrementa il valore.

pagina_inc

Incrementa/decrementa il valore usando i tasti pagina.

cifre

Cifre dopo la il punto (la parte decimale).

tipo

Uno di: SF-SLIDER o 0, SF-SPINNER o 1

SF-COLOR

Crea un pulsante di colore nella finestra di dialogo.

SF-COLOR "etichetta" '(rosso verde blu)

o

SF-COLOR "etichetta" "colore"

Elenco argomenti del widget.

Elemento

Descrizione

"etichetta"

Testo stampato prima del widget.

'(rosso verde blu)

Elenco i tre valori per le componenti rosso, verde e blu.

"colore"

Nome colore in notazione CSS.

SF-FONT

Crea un widget di selezione caratteri nel pannello. Restituisce un nome di carattere come stringa. Ci sono due nuove procedure per la gestione del testo di GIMP per facilitare l'uso di questo parametro di ritorno:

(gimp-text-fontname image drawable x-pos y-pos text border antialias size unit font)

(gimp-text-get-extents-fontname text size unit font)

dove font è il nome del carattere ottenuto. La dimensione specificata nel nome del carattere viene silenziosamente ignorata. Viene usata solo nel selettore del font. Per questa ragione viene richiesto di impostarla ad un valore sensato (24 pixel è una buona scelta).

SF-FONT "etichetta" "nomecarattere"

Elenco argomenti del widget.

Elemento

Descrizione

"etichetta"

Testo stampato prima del widget.

"nomecarattere"

Nome del carattere predefinito.

SF-BRUSH

Crea un widget nel pannello di controllo. Il widget consiste in un'area di anteprima (che se premuta porta in primo piano una finestra di anteprima) ed un pulsante con etichetta "...". Il pulsante provocherà a sua volta la creazione di una finestra di dialogo in primo piano dove si potrà selezionare i pennelli e qualsiasi caratteristica di questi potrà essere modificata.

SF-BRUSH "Brush" '("Circle (03)" 100 44 0)

Qui il pannello pennelli verrà portato in primo piano con un pennello predefinito circolare (03) con opacità 100, spaziatura 44 e modalità di disegno Normale (valore 0).

Se questa selezione non è stata modificata, il valore passato alla funzione come parametro sarà '("Circle (03)" 100 44 0).

SF-PATTERN

Crea un widget nel pannello di controllo. Il widget consiste di un'area di anteprima (che se premuta porta in primo piano una finestra di anteprima) ed un pulsante con etichetta "...". Il pulsante porta a sua volta in primo piano una finestra di dialogo con la quale è possibile selezionare i motivi.

SF-PATTERN "Motivo" "Maple Leaves"

Il valore restituito all'invocazione dello script è una stringa contenente il nome del motivo. Se la selezione precedente non è stata modificata la stringa contiene "Maple Leaves".

SF-GRADIENT

Crea un widget nel pannello di controllo. Il widget consiste in un pulsante contenente un'anteprima del gradiente selezionato.

Se il pulsante viene premuto viene portata in primo piano una finestra di dialogo di scelta del gradiente.

SF-GRADIENT "Gradiente" "Deep Sea"

Il valore restituito quando lo script viene invocato è una stringa contenente il nome del gradiente. Se la selezione precedente non è stata modificata, la stringa contiene "Deep Sea".

SF-PALETTE

Crea un widget nella finestra di controllo. Il widget consiste in un pulsante contenente il nome della tavolozza selezionata.

Se il pulsante viene premuto viene portata in primo piano una finestra di dialogo di scelta della tavolozza.

SF-PALETTE "Tavolozza" "Colori con nome"

Il valore restituito quando lo script viene invocato è una stringa contenente il nome della tavolozza. Se la selezione precedente non è stata alterata, la stringa dovrebbe contenere "Colori con nome".

SF-FILENAME

Esso conterrà un widget nel pannello di controllo. Il widget consiste in un pulsante contenente il nome di un file.

Se viene premuto il pulsante, viene portata in primo piano una finestra di selezione file.

SF-FILENAME "etichetta" (string-append "" gimp-data-directory "/scripts/beavis.jpg")

Il valore restituito quando lo script viene invocato è una stringa contenente il nome del file.

SF-DIRNAME

Utile sono in modalità interattiva. Molto simile a SF-FILENAME, il widget creato permette di scegliere una directory invece di un file.

SF-DIRNAME "etichetta" "/var/tmp/images"

Il valore restituito quando lo script viene invocato è una stringa contenente il nome della directory.

SF-OPTION

Crea un widget nella finestra di controllo. Il widget è un combo-box (NdT: una combinazione di casella di testo e lista a discesa) che mostra le opzioni passate come lista.

La prima opzione è la predefinita.

SF-OPTION "etichetta" '("opzione1" "opzione2")

Il valore restituito quando lo script viene invocato è il numero delle opzioni scelte, dove la prima opzione viene contata come 0.

SF-ENUM

Crea un widget nel pannello di controllo. Il widget è un combo-box che mostra tutti i valori enumerativi per il dato tipo enumerativo. Quest'ultimo deve essere il nome di un enumerato registrato, senza il prefisso "Gimp". Il secondo parametro specifica il valore predefinito, usando il nick del valore enumerativo.

SF-ENUM "Interpolazione" '("TipoInterpolazione" "lineare")

Il valore restituito, quando lo script viene invocato, corrisponde al valore scelto

Dare un corpo allo script.

Si continui con il nostro addestramento e si aggiungano delle funzionalità allo script.

Creare una nuova immagine.

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.

Una volta che si sa come definire variabili, definire le funzioni e accedere agli elementi di una lista, il resto è presto fatto, si deve solo familiarizzare con le funzioni disponibili nel database delle procedure di GIMP e chiamare tali funzioni direttamente.

Cominciare creando una nuova immagine. Creare una nuova variabile, theImage, a cui assegnare il valore di ritorno della funzione interna gimp-image-new.

Come si può vedere dal navigatore delle procedure la funzione gimp-image-new prende tre parametri: la larghezza dell'immagine, l'altezza e il tipo. Poiché l'immagine verrà successivamente ridimensionata per contenere il testo, creare una immagine 10x10 RGB. Memorizzare le dimensioni dell'immagine in alcune variabili, per potervi fare riferimento e manipolarle più avanti nello 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 ritornano una lista, anche se contenente un unico elemento, perciò è necessario ottenere la testa della lista.

Aggiungere un nuovo livello all'immagine.

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 quì). 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
                           NORMAL
                          )
                      )
            )
         ) ;fine delle variabili locali
      

Una volta disponibile il nuovo livello occorre aggiungerlo all'immagine:

        (gimp-image-add-layer theImage theLayer 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)

Si salvi il lavoro e si selezioni Filtri → Script-Fu → Aggiorna gli script, si esegua lo script, dovrebbe comparire una nuova immagine. È probabile che contenga spazzatura (colori casuali) poiché non è stata cancellata esplicitamente. Lo si farà in un attimo.

Aggiungere il testo.

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 BACKGROUND-FILL)
      

Dopo aver pulito l'immagine si è pronti per l'aggiunta del testo:

        (set! theText
                      (car
                           (gimp-text-fontname
                            theImage theLayer
                            0 0
                            inText
                            0
                            TRUE
                            inFontSize PIXELS
                            "Sans")
                       )
        )
      

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-width  theText) ) )
        (set! theImageHeight  (car (gimp-drawable-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)
      

Salvare il lavoro, aggiornare il database e provare lo script.

Reimpostare il dirty flag.

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.

Estendere lo script Text Box.

Gestire correttamente l'annullamento.

Quando si crea uno script, si vuol dare agli utenti la possibilità di annullare le loro operazioni nel caso commettano degli errori. Ciò si può ottenere facilmente chiamando le funzioni gimp-undo-push-group-start e gimp-undo-push-group-end prima e dopo il codice che elabora l'immagine. Esse possono essere pensate come istruzioni accoppiate, che fanno sapere a GIMP quando iniziare e fermare la registrazione delle operazioni sull'immagine, in modo da poterle annullare in un secondo momento.

Se si crea una immagine completamente nuova non ha molto senso utilizzare queste funzioni poiché non si sta modificando una immagine preesistente. Tuttavia quando si modificano altre immagini è consigliabile farne uso.

L'annullamento di uno script è possibile solo quando si utilizzano queste funzioni.

Ulteriore estensione dello script.

Ora che si ha uno script per creare riquadri di testo aggiungiamovi due funzionalità:

  • Attualmente, l'immagine viene ridimensionata per contenere in maniera precisa il testo senza ulteriore spazio per ombre o effetti speciali (anche se altri script ridimensionano le immagini se necessario). Si aggiungerà uno spazio attorno al testo e si consentirà all'utente di impostare quanto aggiungerne definendolo in percentuale rispetto alla dimensione complessiva del testo.
  • Questo script potrebbe facilmente essere utilizzato in altri script che lavorano con il testo. Lo si estenderà facendogli ritornare l'immagine e i livelli in modo che altri script possano chiamarlo e utilizzare le immagini e i livelli creati.

Modificare i parametri e la funzione di registrazione.

Per consentire all'utente di specificare la dimensione della spaziatura si aggiungerà un parametro alla funzione principale e alla funzione di registrazione:

  (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
  (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 si creerà in seguito

           (theBuffer)        ;aggiunto

           (theLayer
                     (car
                         (gimp-layer-new
                          theImage
                          theImageWidth
                          theImageHeight
                          RGB-IMAGE
                          "layer 1"
                          100
                          NORMAL
                         )
                     )
           )
        ) ;fine variabili locali

   [Codice qui]
 )
      
  (script-fu-register
    "script-fu-text-box"                        ;func name
    "Text Box"                                  ;menu label
    "Creates a simple text box, sized to fit\
      around the user's choice of text,\
      font, font size, and color."              ;description
    "Michael Terry"                             ;author
    "copyright 1997, Michael Terry;\
      2009, the GIMP Documentation Team"        ;copyright notice
    "October 27, 1997"                          ;date created
    ""                     ;image type that the script works on
    SF-STRING      "Text"          "Text Box"   ;a string variable
    SF-FONT        "Font"          "Charter"    ;a font variable
    SF-ADJUSTMENT  "Font size"     '(50 1 1000 1 10 0 1)
                                                ;a spin-button
    SF-COLOR       "Color"         '(0 0 0)     ;color variable
    SF-ADJUSTMENT  "Buffer amount" '(35 0 100 1 10 1 0)
                                                ;a slider
  )
  (script-fu-menu-register "script-fu-text-box" "<Image>/Font/Create/Text")  

Aggiungere nuovo codice.

Si aggiungerà il codice in due posizioni: appena prima il ridimensionamento dell'immagine e alla fine dello script (per restituire l'immagine, il livello e il testo).

Dopo aver ottenuto le dimensioni del testo si devono aggiustare i valori in base all'entità della spaziatura specificata dall'utente. Non si effettuerà nessun controllo di errore per assicurarsi che il valore sia compreso tra 0 e 100% anche per dare la possibilità di immettere valori superiori come ad esempio «200» come percentuale del buffer da aggiungere.

        (set! theBuffer (* theImageHeight (/ inBufferAmount 100) ) )

        (set! theImageHeight (+ theImageHeight theBuffer theBuffer) )
        (set! theImageWidth  (+ theImageWidth  theBuffer theBuffer) )
      

Il codice imposta la spaziatura in basse all'altezza del testo e la somma due volte sia all'altezza che alla larghezza della nuova immagine. (La si somma due volte perché la spaziatura è su entrambi i lati).

Ora che l'immagine è stata ridimensionata tenendo conto della spaziatura si deve centrare il testo all'interno dell'immagine. Questo si ottiene spostando lungo le coordinate (x, y) il livello del testo di (theBuffer, theBuffer). Aggiungere la linea seguente dopo il ridimensionamento dell'immagine:

        (gimp-layer-set-offsets theText theBuffer theBuffer)
      

Salvare lo script e provarlo dopo aver aggiornato il database.

Quello che rimane è ritornare l'immagine, il livello e il livello del testo. Dopo la visualizzazione dell'immagine aggiungere la linea seguente:

(list theImage theLayer theText)

Questa è l'ultima linea della funzione, la lista viene quindi resa disponibile ad altri script che vogliano farne uso.

Per utilizzare il nuovo script Text Box in un altro script si potrebbe scrivere qualcosa come:

        (set! theResult (script-fu-text-box
                         "Some text"
                         "Charter" "30"
                         '(0 0 0)
                         "35"
                        )
        )
        (gimp-image-flatten (car theResult))
      

Complimenti, si è ora in procinto di acquisire la Cintura Nera di Script-Fu!

Lo script e il suo funzionamento.

Cosa scrivere.

Segue lo script completo:

  (script-fu-register
            "script-fu-text-box"                        ;func name
            "Text Box"                                  ;menu label
            "Creates a simple text box, sized to fit\
              around the user's choice of text,\
              font, font size, and color."              ;description
            "Michael Terry"                             ;author
            "copyright 1997, Michael Terry;\
              2009, the GIMP Documentation Team"        ;copyright notice
            "October 27, 1997"                          ;date created
            ""                     ;image type that the script works on
            SF-STRING      "Text"          "Text Box"   ;a string variable
            SF-FONT        "Font"          "Charter"    ;a font variable
            SF-ADJUSTMENT  "Font size"     '(50 1 1000 1 10 0 1)
                                                        ;a spin-button
            SF-COLOR       "Color"         '(0 0 0)     ;color variable
            SF-ADJUSTMENT  "Buffer amount" '(35 0 100 1 10 1 0)
                                                        ;a slider
  )
  (script-fu-menu-register "script-fu-text-box" "<Image>/File/Create/Text")
  (define (script-fu-text-box inText inFont inFontSize inTextColor inBufferAmount)
    (let*
      (
        ; define our local variables
        ; create a new image:
        (theImageWidth  10)
        (theImageHeight 10)
        (theImage)
        (theImage
                  (car
                      (gimp-image-new
                        theImageWidth
                        theImageHeight
                        RGB
                      )
                  )
        )
        (theText)             ;a declaration for the text
        (theBuffer)           ;create a new layer for the image
        (theLayer
                  (car
                      (gimp-layer-new
                        theImage
                        theImageWidth
                        theImageHeight
                        RGB-IMAGE
                        "layer 1"
                        100
                        NORMAL
                      )
                  )
        )
      ) ;end of our local variables
      (gimp-image-add-layer theImage theLayer 0)
      (gimp-context-set-background '(255 255 255) )
      (gimp-context-set-foreground inTextColor)
      (gimp-drawable-fill theLayer BACKGROUND-FILL)
      (set! theText
                    (car
                          (gimp-text-fontname
                          theImage theLayer
                          0 0
                          inText
                          0
                          TRUE
                          inFontSize PIXELS
                          "Sans")
                      )
        )
      (set! theImageWidth   (car (gimp-drawable-width  theText) ) )
      (set! theImageHeight  (car (gimp-drawable-height theText) ) )
      (set! theBuffer (* theImageHeight (/ inBufferAmount 100) ) )
      (set! theImageHeight (+ theImageHeight theBuffer theBuffer) )
      (set! theImageWidth  (+ theImageWidth  theBuffer theBuffer) )
      (gimp-image-resize theImage theImageWidth theImageHeight 0 0)
      (gimp-layer-resize theLayer theImageWidth theImageHeight 0 0)
      (gimp-layer-set-offsets theText theBuffer theBuffer)
      (gimp-display-new theImage)
      (list theImage theLayer theText)
    )
  )
      

Il risultato a schermo.

Il risultato a schermo.

 

Google

Ricerca personalizzata



Se ti è piaciuto l'articolo , iscriviti al feed cliccando sull'immagine sottostante per tenerti sempre aggiornato sui nuovi contenuti del blog:
Come diventare un mago di GIMP: una guida sugli Script-Fu (seconda parte)

Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :