Mentre stavo cipollando, come al solito, per sistemare le foto delle vacanze a Miami ho trovato qualche opzioncina che potrebbe essere utile.
Il find è semplice, e accatta i nomi dei file ( -iname, case insensitive) nella dir locale.
Poi entra in gioco xargs che prende l’output di find mettendo un argomento per linea (-L 1) e prende in consegna le occorrenze con -I {} (-I implica -L che quindi potrebbe essere evitato): in questo modo otteniamo delle copie dei file .jpg ridotte del 50% nella directory dir/.
In effetti un comando come quello che segue sarebbe stato anche più rapido (vedi vecchio post sui thumbnail).
Ho già parlato in ben 2 occasioni (uno e due) di quello spettacolo che è convert di ImageMagick.
Di norma uso il programma per ridurre proporzionalmente le dimensioni delle immagini tramite bash script (opzione -thumbnail) o per cambiare formato.
Un’altra cosa ficca che avevo fatto era creare sequenze di foto con -delay e -morph.
Di recente ho dovuto anche ritagliare alcune foto in modo da escludere i bordi e creare tagli più o meno interessanti. Per fare questo è stato necessario scomodare la flag -crop.
Partiamo da un’immagine abbastanza grandicella
sim@idrogeno:~/img$ identify globo.jpg
globo.jpg JPEG 1024x1024 1024x1024+0+0 DirectClass 8-bit
169.07kb
che guarda caso rimpicciolisco con $ convert globo.jpg -thumbnail 300x globo_300.jpg in modo da avere un’immagine decente per il bloggo:

Ora, abbiamo questa immagine grande, ma noi vogliamo solo la fascia sopra l’equatore e sotto il polo nord…
sim@idrogeno:~/img$ convert globo.jpg -crop 1024x240+0+150
globo_fascia.jpg
che (ridimensionata) ci darà questo taglio:

-crop richiede come parametri $larghezza x $altezza della nuova immagine + la distanza dal bordo sinistro e dall’alto (sì, il punto di partenza di crop è l’angolo in alto a sinistra); quindi essenzialmente noi abbiamo detto a convert di prendere l’immagine globo.jpg, e ritagliare un jpg di 1024×240 a partire dalla posizione (0,150) dello schermo.
Nel caso avessimo molte foto di formati diversi e sapendo che i nostri soggetti sono al centro di esse, possiamo fare il taglio con crop partendo dal centro utilizzando il flag -gravity Center.
sim@idrogeno:~/img$ convert globo.jpg -gravity Center
-crop 500x500+0-200 globo_centro.jpg
Con questa riga ho crop’pato un’immagine di 500×500 che è partita dal centro grazie a -gravity Center, ma con uno spostamento di 0 verso sinistra e -200 verso il basso (o meglio +200 verso l’alto).
Il risultato è il seguente:

Per ulteriori info su crop, andare qua.
Nota finale: scrivendo una cosa come
convert globo.jpg -crop 128x128 shard.jpg
otterremo tanti frammenti (di 128×128 pixel) della nostra immagine iniziale (li numera direttamente convert; nel caso specifico ho creato 64 “piastrelle”).
sim@idrogeno:~/img$ convert globo.jpg -thumbnail 512x
globo_512.jpg
sim@idrogeno:~/img$ convert globo_512.jpg -crop 512x128
globsh.jpg
sim@idrogeno:~/img$ convert -morph 15 -delay 10 globsh-*
globsh-0.jpg globsh4.gif

Tempo fa avevo scritto un post su convert per indicarne le semplici funzioni che permettevano di ridimensionare le immagini.
Oramai il procedimento è automatico grazie a scriptini tipo
# for ARG in immagini_* ; do convert $ARG -thumbnail 150x `echo $ARG | sed s/jpg/thumb\.jpg/`; done
che da riga di comando mi permettono di creare tutte le thumbnail di cui ho bisogno e poi upparle comodamente col client ftp.
Complice una guidina di Toonik, mi sono ri-cimentato nel manipolare un po’ su ImageMagick, e ho avuto modo così di creare le mie prime gif animate.
Per creare slide di una serie di foto:
# convert -delay 100 serie_di_immagini_* animata.gif
L’argomento dell’opzione -delay sono il numero di centesimi di secondo che devono passare fra un’immagine e la seguente della serie.
Un altro comando stupendo (a mio avviso) è quello che crea una dissolvenza delle immagini. L’effetto è notevole.
# convert -morph 15 -delay 10 serie_di_immagini_*.jpg prima_della_serie.jpg fade.gif
Ammesso che solo questo effetto per me vale il “prezzo del biglietto”, esso richiede un po’ più di studio.
L’opzione -delay come prima delinea l’attesa fra un frame ed un altro – quindi in questo caso andrà tenuto breve per far sì che l’occhio percepisca la transizione fra i vari frame sfumati che -morph crea. (Ricordo che la breakline dell’occhio è di 25 frame per second, come studiato alle medie.
)
La trasformazione vera e propria è dovuta a -morph che utilizza il numero di interpolazioni indicato (in questo caso 15) per sfumare l’immagine precedente in quella successiva.
Piccolo trucco. Per rendere il loop fra le immagini “continuo”, ho utilizzato un piccolo accorgimento: ripetere la prima immagine in fondo alla serie (come si vede dal mio esempio da riga di comando). Questo è necessario perchè convert ritiene concluso il ciclo all’arrivo dell’ultima immagine, quindi il passaggio dall’ultima alla prima del ciclo successivo sarebbe senza morphing; aggiungendo invece nuovamente l’immagine#1, quando convert arriva all’ultima immagine del ciclo (che in tal senso diventa la penultima), la sfuma nella prima, per poi riavviare il loop.
Infine, presento un gif animato creato con 100 interpolazioni (-morph 100) e un ritardo di un centesimo di secondo per ognuna di esse (-delay 1). L’occhio non distingue più i frame e l’animazione risulta estremamente fluida. Ovviamente tutto questo sforzo non è necessario, soprattutto in casi in cui le immagini non sono nemmeno molto simili fra di loro (come nel mio esempio).
Si tenga conto inoltre che questa gif con tanti frame pesa 6 mega invece che 1 come la precedente…
Nota. display animazione.gif non mi visualizzava i gif con il ritardo esatto, ma un po’ rallentato. (Non ho indagato sulle ragioni.) I controlli per vedere il lavoro finito li ho fatti con gwenview.
Oggi ho provato due comandi nuovi.
- Il primo è convert. Esagerato. Un pezzo di ImageMagick funzionalissimo e utilissimo.
Per ora la riga di comando utilizzata è molto semplice, ma il manuale riporta qualche quintale di esempi i funzionalità che andranno analizzate.
Un esempio per creare un’immagine ridotta di larghezza definita e altezza in proporzione.# convert image_input.jpg -thumbnail 250x image_output.jpg
Un esempio che crea una scritta a sfondo trasparente.
# convert -size 430×85 xc:transparent -font Bookman-DemiItalic -pointsize 72 -draw “text 25,70 ‘Simotrone’” -channel RGBA -gaussian 0×6 -fill darkred -stroke magenta -draw “text 20,65 ‘Simotrone’” file.png
E il manuale di convert si trova qua, e ce n’è da imparare.
- Il secondo comando è hdparm e concede informazioni interessanti sulla rapidità del disco e della ram. (segnalato da aCaB.)
Un esempio con la sistemazione provvisoria di idrogeno.# hdparm -tT /dev/hda
/dev/hda:
Timing cached reads: 528 MB in 2.00 seconds = 263.71 MB/sec
Timing buffered disk reads: 166 MB in 3.01 seconds = 55.21 MB/secDopo aver aggiornato idrogeno con hardware un po’ migliore…
idrogeno:# hdparm -tT /dev/sda2
/dev/sda2:
Timing cached reads: 2328 MB in 2.00 seconds = 1164.94 MB/sec
Timing buffered disk reads: 192 MB in 3.00 seconds = 63.90 MB/sec