Archivi categoria: grafica

Gimp: bilanciamento automatico del bianco su più file

Ecco un altro script-fu che mi capita di utilizzare molto spesso come punto di partenza quando mi metto al lavoro su un numero considerevole di foto: uno script-fu per il bilanciamento automatico del bianco.

Una delle tecniche per migliorare rapidamente le proprie foto consiste nel bilanciare il bianco, ovvero nell’eliminare eventuali dominanti colorate. Con Gimp questa operazione può essere svolta molto rapidamente, infatti basta selezionare la voce di menu:

Colori -> Auto -> Bilanciamento del bianco

Tuttavia ripetere questa operazione su un nutrito numero di fotografie può risultare estremamente noioso.

Per questo mi sono scritto il seguente script-fu:

(define (levels-batch pattern)
(let* ((filelist (cadr (file-glob pattern 1))))
(while (not (null? filelist))
(let* ((filename (car filelist))
(image (car (gimp-file-load RUN-NONINTERACTIVE
filename filename)))
(drawable (car (gimp-image-get-active-layer image))))
(gimp-levels-stretch drawable)
(gimp-file-save RUN-NONINTERACTIVE
image drawable filename filename)
(gimp-image-delete image))
(set! filelist (cdr filelist)))))

In particolare il comando “gimp-levels-stretch” esegue il bilanciamento del bianco.

Per eseguire questo script su tutte le immagini presenti in una directory è sufficiente eseguire la seguente riga:

gimp -i --verbose -b '(levels-batch "*.JPG")' -b '(gimp-quit 0)'

Annunci

Operazioni batch con Gimp

Probabilmente quando in Linux è necessario compiere operazioni batch su molte immagini quasi tutti si affidano all’ottimo ImageMagick, però pochi sono a conoscenza del fatto che anche Gimp offre la possibilità di eseguire  comandi batch.

Street Wings

In particolare è possibile eseguire Gimp senza interfaccia grafica tramite l’opzione -i, ed è possibile eseguire singoli comandi o sequenze di comandi tramite l’opzione -b:

gimp -i -b ‘(comando parametri)’ -b ‘(gimp-quit 0)’

Questa funzionalità è molto comoda ad esempio se si vuole eseguire uno script-fu su un grosso numero di file.

Tuttavia gli script-fu devono essere predisposti per lavorare su più file. Ad esempio di seguito riporto una versione “batch” dello script-fu per la maschera di contrasto riportata in un mio precedente post.

(define (maschera-di-contrasto-batch pattern)
(let* ((filelist (cadr (file-glob pattern 1))))
(while (not (null? filelist))
(let* ((filename (car filelist))
(image (car (gimp-file-load RUN-NONINTERACTIVE
filename filename)))
(drawable (car (gimp-image-get-active-layer image))))
(gimp-levels-stretch drawable)
(set! drawable (car (gimp-layer-copy drawable 100)))
(gimp-layer-set-mode drawable OVERLAY)
(gimp-image-add-layer image drawable -1)
(gimp-invert drawable)
(gimp-desaturate-full drawable 2)
(plug-in-gauss 1 image drawable 25 25 0)
(gimp-image-flatten image)
(set! drawable (car (gimp-image-get-active-layer image)))
(gimp-file-save RUN-NONINTERACTIVE
image drawable filename filename)
(gimp-image-delete image))
(set! filelist (cdr filelist)))))

Quali sono le modifiche principali rispetto alla versione base dello script?

  1. come parametro di ingresso questo script si aspetta un pattern. Ad es: *.jpg
  2. con il comando flie-glob ottengo la lista dei file che soddisfano il pattern all’interno della cartella corrente
  3. ciclo (con il comando while) sulla lista dei file:
    1. notare il comando car per estrarre la testa della lista (il primo file)
    2. e il comando cdr (in fondo) per aggiornare la lista eliminando il file appena processato
  4. opzioni RUN-NONINTERACTIVE per i comandi gimp-file-load e gimp-file-save, per bloccare le interazioni con l’utente.
  5. manca la parte di registrazione dello script e posizionamento nel menù, proprio perchè è pensato per essere eseguito come batch, senza interfaccia grafica.

Quindi come posso eseguire questo script su tutte le immagini Jpeg presenti nella directory corrente? Semplice:

gimp -i –verbose -b ‘(maschera-di-contrasto-batch “*.JPG”)’ -b ‘(gimp-quit 0)’

Script-fu: maschera di contrasto

Dopo la mia introduzione agli Script-fu (per maggiori dettagli visitate la guida ufficiale di Gimp, davvero ben fatta!), oggi voglio condividere un piccolo script che ho fatto nel lontanissimo 2006: una semplice maschera di contrasto (la guida con i passi manuali è disponibile qui). Per iniziare ecco il PRIMA (sx)  e DOPO (dx):

mascheraGimp

Come potete vedere l’effetto che si ottiene è una migliore resa dei mezzi toni e una riduzione delle alte e basse luci. Chiaramente questo effetto non è sempre desiderato, dipende molto dalla tipologia di foto che si sta elaborando.

Vediamo come è strutturato lo script:

(define (script-fu-maschera-di-contrasto inImage inLayer)
(let* ((newLayer 0))
 (set! newLayer (car (gimp-layer-copy inLayer 100)))
 (gimp-layer-set-mode newLayer OVERLAY)
 (gimp-image-add-layer inImage newLayer -1)
 (gimp-invert newLayer)
 (gimp-desaturate-full newLayer 2)
 (plug-in-gauss 1 inImage newLayer 25 25 0)
 (gimp-layer-set-mode newLayer 5)
 (gimp-image-flatten inImage)
(gimp-displays-flush)
 )
)
(script-fu-register "script-fu-maschera-di-contrasto"
 "<Image>/Script-F_u/_Custom/_Maschera di Contrasto..."
 "Migliora le foto digitali"
 "Walter Corno"
 "2006, Walter Corno"
 "2 Agosto 2006"
 "RGB*"
 SF-IMAGE "The Image" 0
 SF-DRAWABLE "The Layer" 0)

Lo script è suddiviso in 3 macro gruppi:

  1. Intestazione: contiene un identificativo dello script  e i parametri in ingresso
  2. corpo centrale: contiene tutte le istruzioni che costituiscono lo script. Nell’esempio:
    1. definizione di una variabile “newLayer”
    2. copia del layer dell’immagine nel nuovo layer “newLayer”
    3. impostazione della modalità “Sovrapposto” (Overlay) per il nuovo layer
    4. aggiunta del layer all’immagine (come primo layer)
    5. inversione dei colori del layer
    6. desaturazione del layer
    7. fusione dei due layer dell’immagine
  3. metadati dello script e posizionamento all’interno del menù di Gimp

Questo script deve essere salvato in un file “.scm” e collocato nella directory “scripts” di Gimp (all’interno della vostra home cercate la directory “.gimp-2.8/scripts”).

Personalizzare Gimp: introduzione agli Script-fu

Immagine

Probabilmente non tutti gli utilizzatori di Gimp sono a conoscenza della possibilità di estendere il set di filtri predefinito attraverso nuovi script scaricabili da internet o creati direttamente da loro.

Per estendere le funzionalità di Gimp ci sono vari modi, il modo più semplice e veloce è tramite i cosiddetti Script-fu, ovvero dei file con estensione .scm tramite i quali è possibile automatizzare una serie di operazioni su un’immagine (ad esempio è possibile bilanciare il bianco, applicare una maschera di contrasto ed aumentare la saturazione dei colori con un solo script).

Per poter scrivere i propri Script-fu è necessario conoscere almeno le basi del linguaggio Scheme, un dialetto di Lisp (il paradiso e l’inferno delle parentesi tonde).

Le basi di questo linguaggio sono molto semplici:

  • ogni comando (funzioni, dichiarazioni,…) è racchiuso tra parentesi tonde (comando)
  • i comandi utilizzano la notazione prefissa (funzione/operatore parametro1 parametro2)
  • Scheme è un linguaggio non tipizzato
  • Le variabili si dichiarano utilizzando il costrutto let*
  • Lo scope delle variabili è racchiuso nelle tonde che contengono il costrutto let*, es:

(let* ((a 5))(+ a 2)) [dichiaro la variabile a e gli assegno il valore 5 (notare le doppie parentesi dopo let*), quindi sommo a+2]

  • per modificare il valore di una variabile si utilizza il costrutto set!, es:

(let* ((a 5)) (set! a 18))

  • essendo Scheme un dialetto di Lisp, è anch’esso basato sulle liste, la definizione di una lista di valori scalari ha la seguente sintassi:

‘(val1 val2 val3)

  • per creare una lista concatenando valori scalari si usa la funzione di concatenamento cons, es:

(cons 1 ‘(2 3))

  • per definire una lista composta da scalari e variabili si usa la funzione list, es:

(list 5 a 3 b c)

  • infine con le funzioni carcdr si ottengono l’elemento di testa ed il “resto” della lista.

Per poter fare un po’ di pratica con Scheme si può utilizzare la “Console Script-Fu” di Gimp (menu Filtri->Script-Fu->Console), con la quale si possono provare ad eseguire in tempo reale semplici comandi Scheme.

Prossimamente pubblicherò qualche script che ho realizzato per automatizzare alcune operazioni di post produzione sulle foto.

Accessibilità pagine web: gli strumenti

Ispirato dalla serie di post di Fabry sul tema accessibilità (parte 1 qui), ho deciso di parlare di un paio di strumenti di verifica della conformità delle pagine web che sviluppiamo rispetto alle principali normative in ambito di accessibilità (per una infarinatura di alto livello sull’accessibilità vi consiglio di leggere i post linkati precedentemente).

Gli strumenti di cui parlerò mi è capitato più volte di utilizzarli sviluppando servizi per la PA (in quanto è richiesta la conformità rispetto alla legge Stanca). Si tratta di AChecker e di Colour Contrast Analyzer Firefox Extension (che ovviamente è un plugin per Firefox).

AChecker

Si tratta di una applicazione web scritta in PHP che permette di testare la conformità delle nostre pagine web rispetto ai principali standard in termini di accessibilità (WCAG1.0 e 2.0) e rispetto alle principali normative nazionali ed internazionali (Legge Stanca, Section 508). È possibile utilizzarla sia online sul sito del tool, sia scaricarla e installarla in locale all’interno di una propria istanza di server web (utile soprattutto per testare pagine che non volete diffondere in rete prima del tempo…)

Attraverso questo tool è possibile richiedere la verifica di una pagina sia attraverso l’inserimento di un URL valido, sia attraverso l’upload del file HTML (nel caso di pagine server-side è necessario fare l’upload dell’HTML generato).

Questo tool vi segnalerà sia gli errori di validazione sintattica della pagina (rispetto al DOCTYPE indicato nella pagina stessa), sia gli errori relativi all’accessibilità (rispetto agli standard/normative che avrete indicato), in particolare gli errori sono suddivisi in:

  • Errori noti: questi sono errori certi, che dovete assolutamente correggere
  • Errori verosimili: questi sono possibili errori (warning), spesso non sono veri errori, ma semplicemente indicazioni di potenziali problemi di accessibilità (ad esempio contenuti poco significativi di attributi quali title)
  • Errori potenziali: sono suggerimenti su come migliorare ulteriormente l’accessibilità, ad esempio la mancanza del cosiddetto breadcumb ovvero una specie di indice della pagina, che riporta un sommario e dei link a delle ancore relative alle varie sezioni della pagina (il tutto nascosto attraverso l’uso dei CSS, ma interpretato per esempio da strumenti quali gli screen reader)

Colour Constrat Analyzer Firefox Extension

Questa estensione per Firefox ci permette di verificare al volo la scelta dei colori della nostra pagina rispetto a possibili problemi di contrasto locale tra testo e sfondo. Tutto ciò senza il minimo sforzo (la verifica manuale del contrasto richiede il calcolo di una apposita funzione non banale basata sul codice RGB dei colori).

Questo strumento è davvero di grande aiuto e ci permette di verificare un aspetto di accessibilità troppo spesso trascurato. L’unica pecca riguarda l’impossibilità di verificare in automatico il contrasto all’interno di una immagine o tra testo e immagine di sfondo (l’operazione è tutt’altro che banale), infatti il controllo automatico si limita ad analizzare il CSS della nostra pagina. Tuttavia è possibile effettuare un test manuale selezionando separatamente il colore del testo e dell’immagine, lo strumento calcolerà immediatamente il contrasto e ci indicherà se è sufficiente rispetto alle varie normative/standard.

L’analisi automatica produrrà un report di questo tipo (vi basta aprire la pagina che volete testare e selezionare dal menù Strumenti->Colour Contrast Analyzer -> tutti i test):

mentre l’analisi manuale è fatta attraverso la seguente interfaccia (l’interfaccia stand-alone la trovate qui):

iText: creare facilmente PDF in Java

Recentemente mi è capitato di dover produrre dei report in java, mi sono quindi posto il problema di quale formato utilizzare per facilitarne una successiva stampa.
La prima scelta è ricaduta su HTML, in quanto risulta molto semplice da generare (essendo un formato testuale) e non necessita di librerie aggiuntive, tuttavia la stampa in java di un documento HTML risulta alquanto problematica, infatti l’unico risultato a cui sono giunto è la stampa del sorgente HTML, non della pagina renderizzata.
Mi sono quindi messo a cercare una libreria che mi permettesse di generare programmaticamente un documento PDF, imbattendomi in iText

iText in action
iText in action

iText è una libreria java per la generazione e/o modifica dinamica di documenti PDF, con essa è possibile creare molto velocemente e facilmente report anche complessi contenenti tabelle ed altri tipi di formattazione.
È sufficiente creare un oggetto di tipo Document, ottenere un’istanza di PDFWriter ed iniziare ad aggiungere elementi al documento.
Gli elementi principali sono:

  • Chunk: ovvero il più piccolo elemento di testo che può essere aggiunto, per esempio una frase
  • Paragraph: ovvero una specie di ArrayList di Chunk, Phrase, Image, List,… può contenere testo formattato con stili diversi, e si può specificare un allineamento
  • List: ovvero degli elenchi puntati e/o numerati
  • Image: ovvero immagini, nei più disparati formati
  • Table: ovvero tabelle, per le quali è possibile specificare lo stile dei bordi

Eccovi ora un piccolo esempio:

Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(hello.pdf"));
document.open();
Paragraph p = new Paragraph("This is not an hello world!", FontFactory.getFont(FontFactory.HELVETICA, 18));
p.setAlignment(Element.ALIGN_CENTER);
document.add(p);
document.close();

per concludere qualche link:

Buon divertimento!

EOF