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).
Poiché la libreria Imagick di php NON si comporta proprio come imagemagick da cmdl, mi sono fatto una semplice funzione per thumbnailare le immagini che carico con un form.
Per qualche oscura ragione a differenza di suo padre, la funzione Imagick::thumbnailImage della libreria non riduce a partire dal lato più lungo, quindi bisogna imporre la propria volontà.
function img_resize($src,$dst,$size = 450) {
$max_length = $size; /* Lato maggiore consentito in px */
$img = new Imagick();
$img->readImage($src);
$real_width = $img->getImageWidth();
$real_height = $img->getImageHeight();
if ( $real_width > $max_length || $real_height > $max_length ) {
if ($real_width > $real_height) {
$img->thumbnailImage($max_length,0,false);
} else {
$img->thumbnailImage(0,$max_length,false);
}
}
$img->setImageFormat(‘jpeg’);
$img->writeImage($dst);
$img->destroy();
}
?>
Sono ancora alla ricerca di idee su “modi decenti” per uploadare immagini su di un sito.
L’idea è prendere i file con un form di upload, analizzarli e caricarli nel sistema. Poi metterli nel db, creare l’immagine delle dimensioni giuste e il thumb, poi linkarli quando vengono richiesti.
Le immagini vengono passate nel fs grazie a tempnam(), trasformate con le lib php di imagemagick in formato jpeg, e servite da apache come image/jpeg forzatamente (con ForceType sulla <Directory>).
Per ora non mi vengono idee migliori. Accetto consigli, nel caso.
Ne approfitto per linkare una paginetta semplice semplice di tutorial riguardo le lib php Imagick, visto che non hanno documentazione.
Sempre alla ricerca di un modo rapido per fare delle thumbnail carine… a forza di leggere e scavare:
$ mogrify -path ../th -format gif -size 200x200 -auto-orient
-thumbnail '75x75>' -background transparent -gravity center
-extent 75x75 '*.jpg'
La riga definisce il path (in funzione delle img originali, auto-orienta l’immagine, ne crea un thumbnail con il lato più lungo di 75px, sbatte il risultato in un quadrato di 75×75 pixel centrando l’oggetto e ci mette un background di colore trasparente. ^_^
Una buona lettura è stata questa qua: Creating Thumbnails and Framing
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.