Per poter facilmente inviare un cospicuo numero di immagini da internet mi son trovato a doverle ridimensionare tutte, cosa assai facile se si fa con bash!🙂

Ebbene si, niente Photoshop, Gimp o amenità varie! Quello che andremo ad utilizzare è la shell di Linux e una raccolta di programmi contenuti nel pacchetto ImageMagik!

Quindi, come sempre, per prima cosa andiamo ad installarci il necessario, ovvero ImageMagik! Nel caso di Ubuntu:
$ sudo apt-get install imagemagick

Piuttosto che dilungarmi in parole e spiegazioni teoriche riporto direttamente una serie di esempi utili creati da me:

$ mogrify -geometry 640×480 prova.jpg
Il più comodo: ridimensiona un’immagine mantenendo comunque le proporzioni! Nel caso che le proporzioni passate siano diverse da quelle dell’immagine (se volete ridurre un’immagine di 1600×1200 a 1500×1200, ad esempio) l’immagine risultante viene creata riducendo la dimensione in eccesso (nell’esempio precedente l’immagine finale sarà di 1500×1125)! Attenzione, nel caso di immagini più piccole della dimensione passata il risultato sarà ingrandito (e quindi sgranato)!

$ mogrify -resize 640×480 prova.jpg
$ mogrify -resize 640x prova.jpg #utilizzo alternativo
L’opzione resize permette di ridimensionare un’immagine. Se utilizzato come nel primo esempio ridimensiona l’immagine distorcendola nel caso di proporzioni diverse, nel secondo caso invece imposta la larghezza a 640 modificando l’altezza in proporzione (il # è un commento, e nel caso vogliate modificare solo l’altezza basta scrivere x480 invece di 640x).

$ convert -resize 640×480 prova.jpg prova_ridimensionata.jpg
Stesso funzionamento di mogrify, però ci permette di salvare l’immagine originale! convert può tornare molto utile in uno scriptino di questo tipo:

#dato un insieme di file immagine modificali aggiungendo il suffisso ‘_ridimensionata’ per distinguerli dagli originali:
for imgfile in `ls *`
do
imgname=`echo $imgfile | rev | cut -f2- -d. | rev`
imgext=`echo $imgfile | rev | cut -f1 -d. | rev`
convert -geometry 640×480 ${imgfile} ${imgname}_ridimensionata.${imgext}
done

Mi dilungo un attimo sul perché dei vari comandi (se masticate bash andate pure avanti):

  • for imgfile in `ls *`: Mi permette di avere una lista dei file presenti nella cartella, per sicurezza potrei utilizzare ls *.jpg invece di ls *
  • imgname=`echo $imgfile | rev | cut -f2- -d. | rev`: mi permette di estrapolare il nome dell’immagine; considerato che il . (punto) può far parte del nome (ad es: natale_25.12.2008.jpg), inverto la stringa, elimino l’estensione ed inverto nuovamente la stringa.
  • imgext=`echo $imgfile | rev | cut -f1- -d. | rev`: come prima, solo che stavolta l’estensione è l’unica cosa che mi interessa
  • convert -geometry 640×480 ${imgfile} ${imgname}_ridimensionata.${imgext}: Il comando vero e proprio (ovvero quello da piegare poi alle nostre esigenze), le parentesi graffe le utilizzo per ‘proteggere’ il nome delle variabili.

$ identify prova.jpg
Semplicemente ci fornisce una serie di informazioni sull’immagine in questo formato:
prova.jpg JPEG 2048×1536 DirectClass 325kb 0.250u 0:02
Questo comando l’ho segnalato perché comodo se usato in qualche script (per esempio ridimensionare solo se il file non è più piccolo di una dimensione data)!

Se 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 l’inglese la miglior fonte è la documentazione ufficiale!