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