TAGS CLOUD
Incrementa dimensioniDecrementa dimensioni
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.
Pagina 1/2
Lascia un commento
Tag: script Bash, creare, gallerie, fotografiche
Condividi