Estrarre immagini da file PDF

5 06 2009

Recentemente ho avuto necessità di recuperare delle foto che avevo usato in passato per creare un PDF, ma non essendo più in possesso delle immagini originali, l’unica soluzione possibile è stata quella di estrarre tutte le foto dal file PDF stesso.
Fortunatamente Linux ha tutti gli strumenti necessari per svolgere tale compito e nello specifico andremo ad usare: pdfimages, una delle PDF utility fornite dal pacchetto: Poppler-utils, che di norma è già presente in molte distro, ma nel caso così non fosse, sarà sufficiente installarlo attraverso il vostro gestore di pacchetti; ad esempio in Debian e derivate il tutto si risolve con:

# apt-get install poppler-utils [invio]

La velocità e la semplicità d’uso di pdfimages rende l’estrazione di immagini da file PDF un’operazione banale, però prima di iniziare è doveroso ricordare che le immagini estratte verranno salvate nella stessa directory da cui si esegue il comando, per cui è sempre consigliabile creare una cartella di lavoro, dove mettere il file PDF da elaborare e successivamente spostasi nella stessa cartella per eseguire i comandi. Tutto ciò perché altrimenti, al momento dell’estrazione i file immagine creati andrebbero a distribuirsi in tutta la vostra home. A questo punto non ci resta che toccare con mano la potenza di questo tool; con il seguente comando andremo ad estrarre tutte le foto incorporate nel PDF e le salveremo in tutti file che avranno come prima parte del nome: “toonik” seguito da un trattino, da un numero incrementale di tre cifre, un punto ed infine il suffisso del formato.

$ pdfimages file.pdf toonik [invio]

di default pdfimages estrae e salva le immagini in formato PBM (se in scala di grigi) e PPM (se a colori), quindi se vogliamo utilizzare un formato di salvataggio più leggero come il JPEG, dovremo utilizzare lo switch -j in questo modo:

$ pdfimages -j file.pdf toonik [invio]

abbiamo già detto che pdfimages estrae tutte le immagini dal file PDF, ma se noi volessimo estrarre solamente quelle presenti in alcune pagine? Niente paura, possiamo fare anche questo utilizzando le opzioni -f (first) e -l (last) per indicare la prima e l’ultima pagina da processare; quindi, nel caso volessimo ad esempio limitare l’operazione alle pagine: 3, 4 e 5; il comando precedente diventerebbe questo:

$ pdfimages -f 3 -l 5 -j file.pdf toonik [invio]

Infine ricordiamo che con questo tool è possibile lavorare anche su file PDF protetti, basta utilizzare le opzioni -opw o -upw seguite dalla password di protezione.

Ciao e… buona estrazione 🙂





Foto raw con Linux e Dcraw

14 08 2008

Ho ancora addosso il profumo del mare di Hvar e sono assorto nei ricordi della vacanza appena trascorsa, ma ecco che all’improvviso irrompe nel mio ufficio Carlos (un ragazzo argentino che tutti vorrebbero come amico perché è ricco… di neuroni), che mi dice: “su Linux Magazine c’è qualcosa che ti riguarda”. Carlos è felice quando mi vede (gli ho fatto conoscere Linux e lui me ne è grato) ed anch’io sono contento di rivederlo perché lui è sempre… allegro (l’unico problema è che non riesco a capire quando è incazzato). Io non so a cosa si riferisca Carlos, per cui corro a comprare Linux Magazine di agosto e cerco un indizio, ma niente, quindi dopo inutili e sterili ricerche mi decido a chiedere spiegazioni…  in effetti qualcosa c’era, ed a Carlos non era sfuggita, mentre a me si… e questo non è bene 😦  Carlos non si è fermato allo strato superficiale – è riuscito a guardare oltre – in puro stile hacker. Io all’inizio pensavo si trattasse di qualche mio screenshot (come già accaduto in passato), invece questa volta era qualcosa di molto più subliminale… in pratica sia in copertina che all’interno appare per ben 3 volte il disegno di un omino dallo stile vacanziero con una bella macchina fotografica al collo, ebbene Carlos mi ha fatto notare che quella quasi impercettibile riga bianca sulla fotocamera è la scritta: “Toonik”… a questo punto ho scansionato la rivista ed ho potuto appurare che la scritta in realtà è Tonik e non Toonik, comunque il senso non cambia e considerando la mia passione per la fotografia, ne approfitto per scrivere un piccolo articolo su come gestire il formato raw delle fotocamere digitali con Linux.

Innanzitutto spieghiamo brevemente cos’è il formato raw, esso è un particolare metodo di memorizzazione dei dati descrittori di un’immagine che permette di non avere nessuna perdita di qualità rispetto ai segnali catturati dall’apparato. Quindi un file raw, contiene informazioni grezze provenienti direttamente dal sensore della fotocamera, senza subire nessuna elaborazione all’interno della stessa, ed è per questo che può essere equiparato al negativo delle classiche macchine fotografiche a pellicola. Inoltre in una foto raw i colori sono rappresentati da 12 o 14 bit invece che dagli 8 bit del formato jpg, quindi si avranno a disposizione ben 16.000 sfumature di Red, Green e Blue invece delle 256 del jpg. Tutto ciò consente ai fotografi professionisti di avere una più efficace gestione del colore ed un controllo totale sull’immagine, anche se bisogna tener conto del fatto che la maggior quantità di informazioni contenute in un file raw si traduce anche in una dimensione maggiore rispetto ad un jpg. Prima di iniziare è importante ricordare che i produttori di fotocamere (e non solo) identificano i propri file raw ognuno in modo diverso, dando origine ad un numero considerevole di estensioni. Ovviamente nell’eseguire gli script sottostanti ricordate di sostituire l’estensione raw con quella giusta… in caso di dubbi consultate questa tabella:

Formato

Produttore

a r w

S o n y

c r 2

C a n o n

c r w

C a n o n

d c r

K o d a k

d n g

A d o b e

e r f

E p s o n

k d c

K o d a k

m r w

M i n o l t a

n e f

N i k o n

o r f

O l y m p u s

p e f

P e n t a x

p t x

P e n t a x

r a f

F u j i

r a w

P a n a s o n i c

s r f

S o n y

x 3 f

S i g m a

Sotto Linux è possibile gestire questo tipo di file con dcraw, un potentissimo tool a riga di comando (ma che strano). Per pura combinazione… ehm ehm, nel post precedente “Modificare immagini dalla riga di comando” avevamo provveduto a dare questo comando:

# apt-get install imagemagick libjpeg-progs netpbm dcraw [invio]

quindi dovreste aver già installato tutto il necessario (se così non fosse il comando sopracitato è sempre valido). Il numero delle fotocamere supportate da questo software è considerevole, per cui se la vostra è tra queste, possiamo iniziare, tenendo bene in mente che l’utilizzo di base di dcraw è semplicissimo… mentre l’utilizzo avanzato è difficilissimo… noi seguiremo la prima via!

Di default dcraw produce un file ppm (Portable PixMap) lasciando inalterato il raw originale, per cui il comando seguente creerà il file foto.ppm nella stessa cartella contenente il file foto.raw

$ dcraw foto.raw [invio]

il comportamento di default può essere cambiato con l’opzione T che produrrà un file tiff con metadati

$ dcraw -T foto.raw [invio]

l’opzione -e estrae la miniatura (solitamente una jpg) generata dalla fotocamera… attenzione non elabora l’immagine grezza:

$ dcraw -e foto.raw [invio]

usando l’opzione -h generiamo un’immagine a colori con dimensioni dimezzate:

$ dcraw -h foto.raw [invio]

mentre -a calcola il bilanciamento del bianco dalla media dell’intera immagine:

$ dcraw -a foto.raw [invio]

l’opzione -c scrive sullo standard output le immagini decodificate:

$ dcraw -c foto.raw [invio]

quest’ultima opzione è necessaria nel caso volessimo usare una pipe per estrarre la foto e convertirla al volo in jpg con ppmtojpeg:

$ dcraw -c foto.raw | ppmtojpeg > foto.jpg [invio]

nel caso volessimo processare molte foto in batch possiamo eseguire questo scriptino:

$ for i in *.raw; do dcraw -c -a -h $i | ppmtojpeg > `basename $i raw`jpg; echo $i " Conversione riuscita"; done [invio]

Attenzione – il comando precedente dovete eseguirlo all’interno della cartella contenente le foto, o in alternativa aggiungete il $PATH completo in questo modo:

$ for i in ~/cartella_delle_foto/*.raw; do dcraw -c -a -h $i | ppmtojpeg > `basename $i raw`jpg; echo $i " Conversione riuscita"; done [invio]

considerando la lunghezza del comando, potrebbe essere conveniente inserirlo in uno script da tenere sempre a portata di… tastiera.

Un’altro esempio di script è il seguente:

if (for f in ~/cartella_delle_foto/*.raw
do
dcraw -c "$f" | pnmtojpeg > "${f/.raw/.jpg}"
done
)
then
echo "Conversione raw eseguita con successo"
else
echo "Errore... conversione non riuscita"
fi

dimenticavo… negli script bash inserite sempre lo shabang

Ovviamente con dcraw si possono fare molte più cose di quante viste in questo contesto e per chi volesse approfondire l’argomento segnalo questo manuale

Bene… visto che ci siamo divertiti abbastanza, vi confesso che per elaborare foto raw con linux esistono anche software interattivi e soprattutto… ad interfaccia grafica… ora direte qualche parolaccia, ma poi vi passa e sarete felici di aver appreso le basi di dcraw… comunque se proprio volete usare un programma grafico, eccovi una lista (non esaustiva) di quelli disponibili per GNU/Linux.





Modificare immagini dalla riga di comando

29 02 2008

Oggi vedremo come gestire le immagini dalla riga di comando, però prima devo parlare di cosa ha ispirato questo post…

L’Università Politecnica delle Marche, l’ISTAO, la Camera di Commercio di Ancona, la Regione Marche e Marche Capital hanno dato vita a eCapital (Business Plan Competition) – un concorso che premia i migliori progetti scaturiti dalle fervide menti degli studenti marchigiani – ed è finalizzato a mettere in contatto il mondo accademico con quello imprenditoriale, in particolare consente ai giovani di trovare capitalisti interessati a finanziare le idee più innovative… almeno in teoria 😉

Potevo esimermi dal presentare un progetto basato su Linux? Ovviamente no, quindi insieme ai miei nipotini Massi e Mattia presento l’idea di un computer basato su una versione personalizzata di Linux, che ci consente di arrivare alla finalissima svoltasi il 9 ottobre 2007 al Teatro delle Muse di Ancona. In quell’occasione facemmo molte foto (soprattutto a Juliana Moreira e Ljdie Pages). Bene, non ci crederete ma da allora ho sempre tergiversato sino a qualche giorno fa, quando Massi e Mattia mi hanno dato l’ultimatum per pubblicare le foto della serata su Picasaweb. A questo punto però si presenta la necessità di sincronizzare e selezionare le nostre foto a distanza; per farla corta… devo ridimensionare tutte le foto della serata per poterle inviare agevolmente attraverso la rete, quindi approfitto della presenza nel mio ufficio di Marco – un amico passato da poco a Linux – e gli dico: Marco, per favore mi dimensioneresti tutte le foto contenute nella cartella Ecapital a 300×200 mentre vado a prendere un caffè con il mio cliente? Ok, risponde lui… ma quando ritorno ne aveva ridimensionate appena una decina, quindi mi rendo subito conto che Marco non conosce ImageMagick e… avreste dovuto vedere la faccia che ha fatto quando ho processato oltre 200 foto in una manciata di secondi con un semplice:

$ mogrify -geometry 300x200 *jpg [invio]

Ebbene si, ho approfittato dell’occasione per parlare di eCapital (come promesso ai nipotini), ma soprattutto per far conoscere ai nuovi entusiasti di Linux una serie di comandi per manipolare immagini di ogni genere.

Prima di procedere verifichiamo che nel nostro sistema sia installato ImageMagick, e se così non fosse… installatelo:

# apt-get install imagemagick libjpeg-progs netpbm dcraw [invio]

N.B. libjpeg-progs, netpbm e dcraw completano il set di strumenti per la manipolazione delle immagini da riga di comando.

Fatto questo sarete pronti per sperimentare la potenza dei comandi disponibili… buon divertimento.

mogrify è uno dei comandi messi a disposizione di ImageMagick ed accetta varie opzioni, iniziamo con lui:

per ridimensionare immagine.jpg a 800×600 px preservando le proporzioni originali:

$ mogrify -geometry 800x600 immagine.jpg [invio]

per ridimensionare immagine.jpg a 800×600 px forzando l’esatta dimensione senza mantenere le proporzioni originali:

$ mogrify -geometry 800x600! immagine.jpg [invio]

per ridurre le dimensioni di immagine.jpg del 50%:

$ mogrify -geometry 50%x50% immagine.jpg [invio]

per aumentare le dimensioni di immagine.jpg del 30%:

$ mogrify -geometry 130%x130% immagine.jpg [invio]

per aumentare la larghezza del 40% e diminuire l’altezza del 40% ad immagine.jpg:

$ mogrify -geometry 140%x40% immagine.jpg [invio]

per ruotare quadrato.jpg di 90 gradi:

$ mogrify -rotate 90 quadrato.jpg [invio]

per ruotare largo.jpg di 180 gradi:

$ mogrify -rotate '180>' largo.jpg [invio]

per ruotare alto.jpg di 180 gradi:

$ mogrify -rotate '180<' alto.jpg [invio]

mogrify con l’opzione flip ribalta verticalmente l’immagine verticale.jpg

$ mogrify -flip verticale.jpg [invio]

convert con l’opzione flip ribalta verticalmente sopra.jpg  creando sotto.jpg

$ convert -flip sopra.jpg sotto.jpg [invio]

mogrify con l’opzione flop ribalta orizzontalmente l’immagine orizzontale.jpg

$ mogrify -flop orizzontale.jpg [invio]

convert con l’opzione flop ribalta orizzontalmente destra.jpg  creando sinistra.jpg

$ convert -flop destra.jpg sinistra.jpg [invio]

per trasformare colore.jpg in un’immagine a 2 colori:

$ mogrify -colors 2 colore.jpg [invio]

per trasformare colore.jpg in un’immagine a 4 colori con il miglioramento dell’errore prodotto dall’algoritmo Floyd-Steinberg:

$ mogrify -colors 4 -dither colore.jpg [invio]

per applicare la mappa dei colori di colore.jpg ad immagine.jpg:

$ mogrify -map colore.jpg immagine.jpg [invio]

per trasformare colore.jpg in bianco e nero in scala di grigi (tipo foto) preservando l’originale:

$ convert -colorspace gray colore.jpg scaladigrigi.jpg [invio]

invece per trasformare colore.jpg in bianco e nero in scala di grigi (tipo foto) sostituendo l’originale:

$ mogrify -colorspace gray colore.jpg [invio]

per trasformare colore.jpg in bianco e nero monocromatico (tipo fax) preservando l’originale:

$ convert -monochrome colore.jpg monocromatico.jpg [invio]

invece per trasformare colore.jpg in bianco e nero monocromatico (tipo fax) sostituendo l’originale:

$ mogrify -monochrome colore.jpg [invio]

per aggiungere un bordo con 2 px di larghezza e 8px di altezza ad immagine.jpg:

$ mogrify -border 2x8 immagine.jpg [invio]

per aggiungere una cornice di 10 px ad immagine.jpg:

$ mogrify -frame 10x10 immagine.jpg [invio]

con l’aiuto di convert possiamo anche riuscire a creare il nostro logo dalla riga di comando:

$ convert -size 310x70 xc:transparent -font Bookman-DemiItalic -pointsize 72 -draw "text 25,60 'Toonik'" -channel RGBA -gaussian 0x6 -fill yellow -stroke black -draw "text 20,55 'Toonik'" marchioToonik.png [invio]

non male… vero?

Ovviamente, specificando un font diverso (es: Times-Bold o Helvetica-Bold) potremo cambiare carattere al nostro logo.

ora passiamo a montage che ci consente di aggiungere un’ombra su sfondo bianco ad una foto:

$ montage immagine.jpg -background white -geometry +10+10 -shadow biancoombra.jpg [invio]

se invece volessimo aggiungere un’ombra su sfondo trasparente ad una foto:

$ montage immagine.jpg -background none -geometry +10+10 -shadow trasparenteombra.png [invio]

bene, usiamo ancora montage, ma questa volta per effettuare il montaggio di molte immagini in una sola di nome collage.png:

$ montage img1.jpg img2.jpg img3.jpg img4.jpg img5.jpg img6.jpg img7.jpg img8.jpg collage.png [invio]

per fondere 2 immagini in una di nome fusione.jpg:

$ combine piccola.jpg grande.jpg fusione.jpg [invio]

puoi fondere 2 immagini in una di nome fusione.jpg assegnando la percentuale di fusione della 2° rispetto alla 1°:

$ combine -blend 70 prima.jpg seconda.jpg fusione.jpg [invio]

assegnando l’argomento difference all’opzione compose del comando combine si ottiene il morphing dell’immagine:

$ combine -compose difference prima.jpg seconda.jpg risultato.jpg [invio]

con l’opzione -comment possiamo aggiungere un commento ad immagine.jpg:

$ mogrify -comment "ciao mondo!" immagine.jpg [invio]

per aggiungere commenti possiamo utilizzare anche il comando wrjpgcom reso disponibile dal pacchetto libjpeg-progs:

$ wrjpgcom "vaffanculo al mondo!" immagine.jpg [invio]

possiamo subito verificare l’esito dei comandi precedenti con il comando rdjpgcom che è anch’esso contenuto in libjpeg-progs:

$ rdjpgcom immagine.jpg [invio]

Imagemagick supporta un numero impressionante di formati e la conversione avviene con una semplicità disarmante, il comando seguente trasforma il file immagine.png in un file jpg:

$ convert immagine.png immagine.jpg [invio]

lo stesso risultato si ottiene con:

$ mogrify -format jpg immagine.png [invio]

con quest’ultimo approccio è anche facile convertire in batch un’intera cartella di foto eseguendo:

$ mogrify -format jpg *.png [invio]

facile vero?

ritornando a convert, esso non si limita alla sola conversione dei formati, ma si rivela utile in molte occasioni, per esempio il prossimo comando convertirà una serie di immagini in una gif animata con un ritardo di 15 centesimi di secondo tra un frame e un altro:

$ convert -delay 15 toonik*.jpg toonik.gif [invio]

per creare un effetto di metamorfosi da viso1.jpg a viso2.jpg attraverso una transizione di 15 frame con ritardo di 10 millisecondi:

$ convert -morph 15 -delay 10 viso1.jpg viso2.jpg metamorfosi.gif [invio]

nel prossimo esempio convert prenderà l’immagine originale.jpg le aggiungerà un bordo 15×15 di colore bianco, poi scriverà in basso a destra la frase tra virgolette con il carattere courier, grandezza 12 e il colore rosso. La frase terminerà a 15 pixel dal bordo laterale destro e sarà distante 10 pixel dal bordo inferiore.

$ convert -border 15x15 -bordercolor white -gravity SouthEast -font courier -pointsize 12 -fill red -draw 'text 15,10 "saluti da toonik"' originale.jpg modificato.jpg [invio]

il comando display è essenzialmente un visualizzatore, ma attivando l’interfaccia grafica con un click si può accedere alle opzioni di ImageMagick… per visualizzare un’immagine digitiamo semplicemente:

$ display immagine.jpg [invio]

import consente di fotografare lo schermo, per fotografare una finestra digitare il comando seguente e quando il cursore prende la forma di una croce cliccare sulla finestra che si vuol fotografare:

$ import finestra.jpg [invio]

per catturare una schermata dell’intero desktop digitare:

$ import -window root schermo.jpg [invio]

l’ultimo comando che analizzeremo serve ad ottenere informazioni sul formato, dimensione e colori del file, quindi per conoscere le caratteristiche del file immagine.jpg digitiamo:

$ identify immagine.jpg [invio]

con l’opzione -verbose si accede a delle informazioni aggiuntive sul file, tra cui eventuali commenti:

$ identify -verbose immagine.jpg [invio]

dimenticavo… il bello della riga di comando è che si possono anche realizzare simpatici script come questo:

for i in *.jpg; do
convert -scale 50% $i toonik-$i
done

o ancora meglio…

come questo postatomi da Simotrone che in un sol colpo crea delle utilissime miniature delle nostre foto e le nomina con l’aggiunta del suffisso thumb in modo da distinguerle da quelle originali che comunque rimarranno inalterate:

for ARG in foto*; do
convert $ARG -thumbnail 300x `echo $ARG | sed s/jpg/thumb\.jpg/`
done

ovviamente il tutto può essere eseguito dal terminale, direttamente come comando:

$ for ARG in foto*; do convert $ARG -thumbnail 300x `echo $ARG | sed s/jpg/thumb\.jpg/`; done [invio]

a patto di posizionarsi preventivamente all’interno della cartella contenente le foto…

e sostituendo foto* con i caratteri iniziali usati dalla vostra camera digitale come prefisso alla numerazione.

Ovviamente le possibilità offerte da ImageMagick sono mooolte di più, ma lascio a voi il piacere della scoperta 🙂 per quanto mi riguarda spero di aver stimolato in chi legge questo blog (pochi amici e parenti) la giusta curiosità su un aspetto di Linux che ultimamente viene troppo spesso dimenticato… la potenza della shell.

Toonik