
Uno script Bash per creare gallerie fotografiche
Basta una directory contenente immagini, per trasformarle automaticamente in una pagina web con le anteprime delle foto, pronte per essere visualizzate dal browser
(pagina 1 di 2)

Applicazioni come Digikam (www.digikam.
org) e F-Spot (http://f-spot.org) consentono di gestire facilmente
grandi collezioni di immagini, con in più la possibilità di creare
rapidamente vere e proprie gallerie fotografiche. In questo caso
specifico, invece, noi vogliamo fare qualcosa di diverso, proponendovi
un “semplice” script Bash che, attraverso l’uso di pochi
comandi shell (in questo caso si tratta
di tool presenti nella suite ImageMagick),
perlopiù disponibili di default
in una qualsiasi distribuzione GNU/
Linux, permette di ottenere risultati
simili e molto accattivanti anche dal
punto di vista grafico. In pratica, crea
una galleria fotografica in formato
HTML visualizzabile con un qualsiasi
browser web, ad esempio Konqueror o Firefox. Come avremo
modo di vedere più avanti, tutte le scelte per quanto riguarda
l’aspetto grafico vengono stabilite attraverso il file template
(template.html), in particolare utilizzando un foglio di stile CSS
(Cascading Style Sheet) aggiunto direttamente al suo interno.
Ma adesso, passiamo subito all’analisi del codice.
[01-02] Oltre al classico incipit che comunica al sistema qual è il
programma da usare per eseguire il codice (in questo caso /bin/
bash), è sempre bene iniziare ogni script con un controllo del
numero di parametri passati sulla riga di comando e, in caso di
errore, stampare un messaggio che aiuti l’utente a comprendere
come utilizzare correttamente il programma. [03-06] In queste
righe prepariamo le variabili utilizzate nel corso dello script: i
parametri passati sulla riga di comando vengono assegnati a due
variabili dal nome più esplicativo (${target_dir} e ${template_
file}), mentre le variabili ${thumbnail_dir} e ${output_file}
contengono rispettivamente il nome della directory che ospiterà
le anteprime a bassa risoluzione delle immagini e il nome del
file di output. Al nome del file di output è stata preposta la
directory
che lo ospiterà in modo da semplificarne l’uso.
[07-10]
Qui prepariamo i file e le directory necessari al programma: la
directory indicata dall’utente viene controllata e, in caso non fosse
presente, il programma termina con un messaggio di errore.
È importante notare che la condizione espressa dopo la parola
if è “! -d”, che significa “non esiste come directory”. Il file
di output, invece, se già esistente, viene rimosso e subito creato
vuoto, mediante il comando touch; molto spesso è necessario creare i
file vuoti all’inizio, in modo da poterli poi riempire
man mano con i contenuti corretti. Infine, troviamo la directory
delle anteprime che, se non esistente, verrà creata.
[11] Questa
sezione riguarda l’elenco delle immagini utilizzate per creare la
galleria, il quale viene posto nella variabile ${images}. Usare
il comando find è il modo più comodo per trovare il gruppo di
file che corrisponde ad una particolare descrizione; il comando è
molto complesso, non è possibile analizzarne tutti gli aspetti, ma
possiamo imparare molto anche dal semplice uso fatto in questo
script. Innanzitutto, bisogna tenere presente che find agisce in
modo ricorsivo, entrando in tutte le sottocartelle; il semplice comando
“find /”, pertanto, è sufficiente ad elencare tutti i file del
sistema; specificando l’opzione “-maxdepth 1” forziamo find a
fermarsi al primo livello, ovvero una volta elencato il contenuto
dei parametri specificati sulla riga di comando. Volendo trovare
tutti i file con estensione JPG o PNG specifichiamo poi due filtri
-iname: “iname” sta per “case Insensitive NAME”, ovvero
cerca in modo indipendente dal case (maiuscole/minuscole) quei
file che corrispondono al pattern specificato; il filtro “-iname
*.jpg”, quindi, troverà anche i file con estensione .JPG, .Jpg,
eccetera. I due filtri devono agire in unione, pertanto sono connessi
da un operatore logico OR, espresso dalla condizione “-o”.
Il comando find ha anche il vantaggio, rispetto ad un semplice
ls, di non stampare messaggi di errore nel caso non trovi nessun
file che risponde al criterio impostato.
 |
La pagina web con le anteprime delle immagini |
[12-21] In questo ciclo
vengono create le anteprime delle immagini; per ogni file trovato,
contenuto nella variabile ${img}, viene creato il corrispettivo
file di anteprima nel modo seguente: ricaviamo il nome del
file togliendo ogni directory preposta con il comando basename
e preponiamo il percorso composto dalla directory che ospita le
immagini più la cartella delle anteprime. In questo modo trasformiamo
il nome di un file “directory/immagine.jpg” in “directory/
thumbs/immagine.jpg”. L’anteprima vera e propria, poi, viene
creata con il comando convert del pacchetto ImageMagick,
che elabora un’immagine salvando il risultato in un file diverso
(differentemente dal comando mogrify che è del tutto identico
a convert ma sovrascrive il file elaborato). Le opzioni passate
a convert sono “-thumbnail” che imposta la conversione in modo adatto
alla creazione di un’anteprima, e la dimensione del
file: quest’ultima è data solitamente nel formato “${larghezza}
x${altezza}”, ma specificando solamente una delle due misure
imponiamo ad ImageMagick di mantenere il rapporto di aspetto
dell’immagine; in questo caso abbiamo stabilito che l’anteprima
avesse larghezza pari a 140 pixel e altezza calcolata automaticamente
per mantenere l’aspetto. Il comando echo alla riga 20 è
un piccolo trucco per visualizzare in modo discreto il funzionamento
di uno script: viene stampato un punto per ogni immagine
elaborata, e l’opzione “-n” impedisce di andare a capo; lo script
stamperà quindi una sequenza di punti, dandoci modo di capire se sta
effettivamente funzionando (una sorta di barra di progressione).
È importante notare, infine, che il comando convert è stato
racchiuso da una condizione if: se il file di anteprima esiste già,
è inutile crearlo nuovamente.
[22] Il file di template contiene la
testa e la coda della pagina HTML di output, pertanto, mediante
il comando head, ne copiamo le prime 38 righe nel file di output;
prima della copia, però, processiamo il testo con il comando sed,
convertendo dei “segnaposto” ({target_dir} e {date}) con dei
valori effettivi: nel primo sed la stringa “{target_dir}”, presente
due volte nel template, viene sostituita con il nome effettivo della
directory esaminata, contenuto nella variabile ${target_dir}; nel
secondo sed la stringa “{date}” viene convertita con l’output del
comando date, che fornisce la data e ora attuale (consultate la
pagina di manuale di date per maggiori informazioni sul formato
di stampa dei dati). Inoltre, è evidente che entrambi i comandi
sed sono seguiti dall’opzione “g”, che impone a sed di sostituire
tutte le stringhe trovate e non solamente la prima.
[23-32] Il
comando echo alla riga 23 non è stato posto casualmente, ma termina la
sequenza di punti stampata alla riga 20. Nel ciclo for
stampiamo per ogni immagine una riga di codice HTML che crea
un link all’immagine stessa, rappresentato dall’anteprima creata
precedentemente. Come vedete, l’output del comando echo
viene ridiretto nel file di output in modalità “append”, ovvero
viene aggiunto al contenuto precedente, mediante il comando
“>>”, mentre alla riga 22 era stato usato il comando di
redirezione
semplice “>”.
 |
Selezione di un’immagine specifica |
[33] Infine, il file di output viene terminato
aggiungendo le ultime due righe del file template, mediante il
comando tail (opposto a head). Questo script è volutamente molto
compatto, e presenta molti punti che potrebbero essere estesi:
in particolare, sarebbe possibile separare i file per data mediante
il comando find, creando varie sezioni della galleria, oppure
arricchire
l’output di informazioni quali la dimensione del file o
dell’immagine (ricavabili con il comando identify di ImageMagick).
Un’ulteriore modifica potrebbe essere utilizzare un foglio
di stile CSS esterno, condiviso da tutte le gallerie: mediante i
CSS è possibile raggiungere risultati grafici sbalorditivi con poco
codice, pertanto anche un semplice script Bash può creare una
galleria in grado di competere con programmi ben più blasonati.