Home > Appunti > Pillole di bash e ImageMagick: conversione batch di file grafici

Pillole di bash e ImageMagick: conversione batch di file grafici

Inserito da amedeo on December 21, 2011

Quante volte ci è capitato di dover manipolare una serie di immagini per cambiarne il formato o le dimensioni ? Quando sono poche possiamo utilizzare Gimp o qualche altro editor grafico ma quando il numero cresce, diventa un lavoro ripetitivo e parecchio noioso.

Allora ci vengono incontro bash e ImageMagick, rivelandosi strumenti comodi ed efficaci che ci permettono di far eseguire il lavoro in automatico mentre noi possiamo dedicarci ad altre attività.

Prerequisiti

Ovviamente sto parlando di ambiente GNU/Linux ma potreste riportare queste tecniche anche in ambiente Windows e Mac, dato che per Windows sono disponibili sia emulatori bash che ImageMagick e in ambiente Mac OS/X sono disponibili sia bash che Imagemagick. Per questi ambienti potrebbero essere necessarie alcune modifiche che non prenderò in considerazione in quanto esulano dallo scopo di questa documentazione.

Potrebbe essere necessario installare ImageMagick, in tale caso fate riferimento alla distribuzione che utilizzate per installarlo, solitamente è disponibile per tutte; per le distribuzioni derivate da debian (come utulizzo io) si può fare dalla shell con:

sudo apt-get install imagemagick

Ridimensionamento delle immagini

Il primo script che prenderemo in considerazione provvede a ridimensionare le immagini trovate nella cartella di esecuzione, creando le copie in una sottocartella.

  1. #!/bin/bash
  2. #
  3. echo -n "larghezza massima (1024): "
  4. read MAX_W
  5. echo -n "altezza massima: (768)"
  6. read MAX_H
  7. #
  8. if [ "$MAX_W" == "" ]; then
  9. MAX_W=1024
  10. fi
  11. #
  12. if [ "$MAX_H" == "" ]; then
  13. MAX_H=768
  14. fi
  15. #
  16. echo "Creazione thumbnails: ${MAX_W}x${MAX_H}"
  17. #
  18. if [ ! -d ${MAX_W}x${MAX_H} ]; then
  19. mkdir ${MAX_W}x${MAX_H}
  20. fi
  21. #
  22. for file in *.jpg *.png *.gif
  23. do
  24. echo "Resizing file $file ..."
  25. convert -resize ${MAX_W}x${MAX_H} "$file" "${MAX_W}x${MAX_H}/$file"
  26. done

Come potete osservare, lo script ci chiede come prima cosa le nuove dimensioni che vogliamo impostare per le immagini. Le istruzioni read servono a richiedere a video i valori di larghezza ed altezza; ai quali, se non li digitiamo, i costrutti if che seguono provvederanno ad assegnare i valori predefiniti.

Per nostra comodità, viene eseguito un controllo sull'esistenza della directory di destinazione che verrà creata se non eiste ancora. La directory avrà come nome le dimensioni richieste, nel caso di quelle predefinite sarà quindi 1024x768.

Finalmente viene la parte di elaborazione: per tutti i file con estensione jpgpng o gif verrà richiamata l'utility convert (facente parte del pacchetto ImageMagick) con l'opzione di ridimensionamento dell'immagine.

Inserimento testo watermark

Un'altra operazione che può esserci utile è l'inserimento di un watermark nelle immagini. Per chi non lo sapesse, il watermark è quel marcho o scritta, simile ad una filigrana che si aggiunge nelle immagini per apporvi una sorta di firma. lo script proposto non ha enormi pretese, dato che mi è servito per preparare le immagini di un cliente per il proprio sito di e-commerce ma può essere uno spunto per ulteriori affinamenti e personalizzazioni.

  1. #!/bin/bash
  2. #
  3. echo -n "Testo Watermark [(C) Inforisorse]"
  4. read WTEXT
  5. if [ "$WTEXT" == "" ]; then
  6. WTEXT="(C) Inforisorse"
  7. fi
  8. #
  9. echo -n "Altezza Watermark [300]"
  10. read H
  11. if [ "$H" == "" ]; then
  12. H=300
  13. fi
  14. #
  15. echo -n "Larghezza Watermark [300]"
  16. read W
  17. if [ "$W" == "" ]; then
  18. W=300
  19. fi
  20. #
  21. echo -n "Dimensione font [12]"
  22. read F
  23. if [ "$F" == "" ]; then
  24. F=12
  25. fi
  26.  
  27. #
  28. echo "Applicazione watermark: $WTEXT"
  29. #
  30. if [ ! -d watermarked ]; then
  31. mkdir watermarked
  32. fi
  33. #
  34. for file in *.jpg *.png *.gif
  35. do
  36. echo "Watermarking file $file ..."
  37. convert -size ${W}x${H} -pointsize $F xc:none -fill white \
  38. -draw "gravity NorthWest \
  39. fill grey70 translate 100,100 rotate 315 text 1,11 '$WTEXT' \
  40. fill white text 2,10 '$WTEXT'" \
  41. -draw "gravity SouthEast \
  42. fill grey70 translate 100,100 rotate 315 text 21,41 '$WTEXT' \
  43. fill white text 22,40 '$WTEXT'" \
  44. miff:- |\
  45. composite -tile - "$file" "watermarked/$file"
  46. done

Come per lo script precedente, questo provvede a richiedere i parametri e ad assegnare valori predefiniti per quelli mancanti; non sto quindi a ripetermi ritenendovi in grado di comprendere il meccanismo per analogia.

Il richiamo alle utility di ImageMagick inserisce il testo, inclinato di 315 gradi (equivalenti a 45° in senso antiorario), con un lieve effetto tridimensionale, in modo che sia visibile sia su parti bianche che parti colorate dell'immagine.

Le opzioni translate 100,100 servono a 'spostare' il riferimento base per la scritta che altrimenti verrebbe troncata per rimanere enro l'area definita per il watermark. Notate che l'opzione vale per entrambe le opzioni fill del comando -draw, per cui non va ripetuta all'interno di esso.

I valori grey70 e white utilizzati come parametro all'opzione fill indicano quali colori utilizzare per la scritta.

I valori riportati dopo l'opzione text indicano la posizione dove deve iniziare la scritta e come potete vedere vengono utilizzati valori diversi per le due opzioni fill di ogni comando -draw, per ottenere lo scostamento dtra le due scritte che si sovrapporranno per formare l'effetto tridimensionale.

Note

Entrambi gli script non sono perfetti, in particolare segnaleranno un errore per le estensioni di cui non trovano file, pur funzionando correttamente ed elaborando tutti i file presenti (per itipi specificati).

Comments:

Rispondi



(La tua email non sarĂ  mostrata pubblicamente)

Inserire le lettere ed i numeri mostrati nell'immagine.Codice captchaFai clic sull'immagine per vedere un altro captcha.