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


Azioni

Information

27 responses

3 03 2008
enrico

Semplicemente stupendo non sai da quanto tempo è che vado da una parte all’altra per cercare di rimpicciolire una foto!(tutto questo anche perche’sono un novellino per il mondo LINUX)Grazie al tuo blog ho potuto anche conoscere meglio picasaweb a cui sin ora avevo dato poca importanza.

6 03 2008
veltro

Semplicemente fantastico!!! ti puoi veramente divertire a modificare le foto in tanti modi! oltretutto usando i comandi della shell, per me che sono un pivellino in materia, mi sembra quasi di essere un gran esperto… Complimenti ancora toonik, non finisci mai di stupirmi!

7 03 2008
toonik

@enrico
non dimenticare che tutti sono novellini… all’inizio,
ma con Linux si impara in fretta e divertendosi 😉
sono felice di aver contribuito a farti apprezzare Picasweb, e se sei appassionato di fotografia potresti trovare interessante anche Flickr.

@veltro
certo… per modificare un’immagine è possibile usare qualsiasi applicazione, ma nel caso di numerose foto…
effettivamente la shell è impareggiabile 😉

19 03 2008
simotrone

Ciao Toon. 🙂

Avevo letto questo post tempo fa, poi m’è passato di mente. Ho sinceramente intenzione di provare mogrify e combine che non conoscevo.

Attualmente io per creare i thumbnailz di determinate dir usavo script simili a questo:
for ARGO in foto_*; do convert $ARGO -thumbnail 300x `echo $ARGO | sed s/jpg/th\.jpg/` ; done

(Forse un po’ macchinoso, non sono un fenomeno, però funzionale.)

21 03 2008
toonik

@simotrone
le funzionalità di ImageMagick sono veramente tante, poi considera (come si evince anche dagli esempi) che lo stesso risultato si può raggiungere adottando procedure e comandi totalmente diversi… a tal proposito ho molto apprezzato il tuo script (l’ho già aggiunto al post) che funziona alla grande e si presta a facili adattamenti… poi c’è sed 😉

6 04 2008
Modificare le immagini da shell « Un informatico a Bologna …

[…] questo utilizzo base di ImageMagik non vi basta potete dare un’occhiata a questo post di Toonik, che spiega anche altri comandi e funzionalità un pò meno ovvie! Se invece masticate […]

20 04 2008
simotrone

Finalmente ho avuto un’occasione per sfruttare i tuoi script!!

convert -morph e -delay sono entrati di diritto nei miei preferiti. ^_^

Thx per avermi messo “la pulce nella tastiera”. 🙂

Ciao
Sim

20 04 2008
SIMOTRONE WEB PAGE » Blog Archive » convert (2)

[…] una guidina di Toonik, mi sono ri-cimentato nel manipolare un po’ su ImageMagick, e ho avuto modo così di creare […]

20 04 2008
toonik

@simotrone
ciao Simo, sono contento di averti messo le pulci nella tastiera… anche perché il risultato è ottimo – complimenti per le le gif… e (da ex motocrossista) per i soggetti 😉
ho letto il tuo post e l’ho trovato veramente interessante sia per il remember sui fps sia per il trucchetto di aggiungere la prima immagine alla fine del ciclo di convert, che effettivamente risolve il problema dell’interruzione del fade.
A proposito di trucchi… io uso spesso un artefatto che in fatto di eleganza non è il massimo, ma fornisce dei risultati egregi… in pratica realizzo con sua maestà The Gimp un’immagine bianca (oppure di un altro colore piuttosto che trasparente) delle stesse dimensioni di quelle che devo processare, per poi inserirla in modo alternato alle mie foto (di solito le immagini reali dispari e quelle bianche pari).
Concordo con te anche per quel che riguarda il problema riscontrato con il comando display, ma a dire il vero ho avuto problemi di visualizzazione delle gif anche con alti programmi; per cui ora le visualizzo in locale direttamente dal browser… in pratica nella barra degli indirizzi di Firefox digito file:///home/toonik/Desktop/work/gif (che corrisponde al path delle mie gif) ed a quel punto mi compare la lista di tutti i file contenuti nella cartella come se stessi usando un filemanager.
Ciao alla prox

28 04 2008
Benji

Grande, proprio quello che cercavo, dovevo ruotare di 90 gradi delle dispense scansionate… e con questo sistema ci ho messo meno di 1 minuto 😀

30 04 2008
toonik

@Benji
mi fa veramente piacere averti aiutato a ruotare le dispense… certo erano un po pesanti, ma alla fine ce l’abbiamo fatta 😀
a parte gli scherzi, grazie del commento e complimenti per il tuo blog.
ciauzz

26 06 2008
Marta

Ciao,
sto cercando di cambiare lo sfondo ad un’immagine che ha lo sfondo grigio su cui si staglia una figura dorata. Credi che sia possibile con imagemagick?
SAi suggerirmi una strada ?
Grazie MArta

27 06 2008
Marta

Ciao Toonik,
l’ho trovato…

convert filename.jpg -fill white -fuzz 10% -draw ‘color 6,6 replace’ filename2.jpg

Grazie ancora
ciao
Marta

27 06 2008
toonik

@Marta
sei un mito…
stavo per risponderti:
“sicuramente è possibile farlo anche con ImageMagick, ma non so come
… appena posso (ora sto combattendo con il php) darò un’occhiata al manuale
… invece eccoti con la soluzione.

Grazie di cuore

21 08 2008
Foto raw con Linux e Dcraw « Linux per tutti

[…] Linux per tutti Linux è di tutti e per tutti… o quasi! « Modificare immagini dalla riga di comando […]

5 10 2008
Alex

Ciao volevo chiedere a qualcuno che conosce molto bene questo software se esiste e sa dirmi il comando per ritagliare automaticamente un’immagine. Per esempio se ho l’immagine rossa con sfondo bianco (quindi la parte da ritagliare è molto semplice) dirgli di eliminare la parte bianca lasciando la parte rossa.

Grazie,
A.

7 10 2008
toonik

@Alex
ipotizziamo di lavorare con un’immagine rossa su sfondo bianco di 640×480, il cui nome è rossa.png
… con il seguente comando eliminiamo lo sfondo bianco e salviamo il risultato nel file rossa2.png
convert -fill transparent -fuzz 10% -draw 'color 2,2 replace' rossa.png rossa2.png

se invece hai intenzione di ritagliare una parte dell’immagine, allora dovresti utilizzare l’opzione crop, fornendo le coordinate X Y appropriate (tieni presente che l’origine degli assi è sempre in alto a sinistra)… quindi con il prossimo comando, eseguiremo un ritaglio di 320×240 intorno all’immagine rossa centrale, spostandoci di 120px X Y e salvando il tutto nel file rossa3.png:

convert rossa.png -crop 320x240+120+120 rossa3.png

poi, se volessi ritagliare l’immagine e contemporaneamente eliminare lo sfondo… niente di più semplice:

convert -fill transparent -fuzz 10% -draw 'color 2,2 replace' -crop 320x240+120+120 rossa.png rossa4.png

ciao e… buon divertimento.

10 01 2009
20 02 2009
Purcidduzzu

Ciao, la tua guida era quel che cercavo per poter ridimensionare un sacco di foto in automatico!
Ho un quesito da porti: quando salvi un jpg da gimp ti propone il livello di compressione e la sottocampionatura. Con ImageMagik è possibile ridimensionare una serie di immagini ma scegliendo anche questi parametri?
Grazie in anticipo 😉

26 02 2009
toonik

@Purcidduzzu
per regolare il livello di compressione con ImageMagick potresti usare l’opzione -quality in questo modo:

mogrify -geometry 400x -quality 50 *.jpg [invio]

quality 0 = qualità peggiore, mentre 100 = qualità migliore…
tieni presente che il valore predefinito è 75, quindi con il valore 50 abbiamo ottenuto una compressione maggiore a scapito però della qualità.

ciao

4 03 2009
Purcidduzzu

grazie 😀

8 03 2009
toonik

@Purcidduzzu
de nada… è stato un piacere 😉
p.s. complimenti per il blog!

11 09 2012
andrea

Ciao toonik,
ottimi consigli per manipolare le immagini velocemente!!
Ho una domanda da fare. E’ possibile visualizzare un’immagine su di un secondo monitor da riga di comando?

grazie ancora e complimenti!!

Andrea

26 02 2013
vintage clothing shops in duluth mn

Very nice post. I just stumbled upon your blog and wanted to say
that I have truly enjoyed surfing around your blog posts.
After all I will be subscribing to your
rss feed and I hope you write again very soon!

9 01 2014
toonik

Ultimamente (da quando possiedo la fantastica PENTAX K-5) mi sto dedicando parecchio alla fotografia e spesso mi capita di scrivere recensioni (in cui allego foto di esempio) a proposito degli obiettivi che più mi piacciono… la maggior parte dei quali sono delle gloriose chicche del passato, tipo i Takumar. In questi casi è molto comodo (e veloce) utilizzare ImageMagick per ridimensionare e contemporaneamente “marchiare” le foto con una firma (o watermark) prima di effettuare l’upload. Ecco come fare:


convert -geometry 600x -quality 100 -gravity SouthEast -font courier -pointsize 12 -fill white -draw 'text 15,10 "© Toonik"' originale.jpg watermark.jpg [INVIO]

In questo caso produrremo un’immagine di 600px di larghezza (che manterrà le proporzioni) e con la scritta di colore bianco, quindi per cambiare colore dal bianco al nero per esempio, sarà sufficiente sostituire white con black. Ovviamente, oltre a quanto detto sopra, dovrete anche sostituire Toonik con il vostro nome e i nomi dei file immagine con quelli appropriati.

Ho voluto aggiornare questo articolo sia per avere un promemoria personale, sia perché penso possa essere utile a parecchi fotografi… infatti cercando in rete ho notato che ancora nessuno aveva condiviso questo piccolo comando.

Visto che abbiamo parlato fi fotografia, ecco la mia Pentax Gallery: http://ita.pentaxphotogallery.com/artists/Toonik

Buona visione… spero vi piaccia 🙂

30 09 2015
Mithrandir

grandioso, grazie =)

20 12 2015
ilnanny

Grazie mille.
Se fosse possibile vorrei fare una richiesta particolare inerente imagemagik o magari come creare un batch ..In pratica stò disegnando un tema di icone per Sistemi operativi Linux (ho già dato un occhiata a Tango icon..ma ho parecchi roblemi con lacomprensione della lingua inglese)
Ho una cartella dove ho disegnato tante icone per i programmi e il sistema stesso essendo tutte in .svg (Inkscape) vorrei trasformale in png 16px,png 22,png24,png32,png48,png64,e creare una cartella scalable per ogni elemento del pacchetto di icone.(apps,places..etc c
Ci sarebbe un comando per velocizzare un pò queste operazioni..Spero di non essere stato molto sconnesso 😀
Grazie ancora per l’how-tow.

Scrivi una risposta a toonik Cancella risposta