Mentre stavo cipollando, come al solito, per sistemare le foto delle vacanze a Miami ho trovato qualche opzioncina che potrebbe essere utile.

find . -maxdepth 1 -iname "*.jpg" | xargs -L 1 -I {} convert {} -resize 50% dir/{}

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).

find . -maxdepth 1 -iname "*.jpg"| xargs mogrify -path th/ -thumbnail 120×120 -quality 75 -format png

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:
Globo 300px
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:
Tropico cancro 300px

-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:
Tropico cancro 300px

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

striscia animata

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. :)

serie discretaPer 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.


dissolvenzaUn 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.

dissolvenzaInfine, 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.

  1. 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.

  2. 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/sec

    Dopo 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

    
SIMOTRONE WEB PAGE is based on WordPress platform, RSS tech , RSS comments design by Gx3.