ImageMagick

Viaggio tra i segreti del tuo pc...

Moderatori: Super Zeta, AlexSmith

Regole del forum
Non aprite topic per ogni sciocchezza, usate quelli già presenti!
Rispondi
Messaggio
Autore
Avatar utente
+Fracassato+
Bannato
Bannato
Messaggi: 3406
Iscritto il: 28/06/2011, 16:24
Località: Copyright ©

ImageMagick

#1 Messaggio da +Fracassato+ »

ImageMagick

Immagine

sito ufficiale: http://imagemagick.org/script/index.php
dal sito ufficiale ha scritto:ImageMagick è una suite software per creare, modificare, comporre, o convertire immagini bitmap.

ImageMagick è un software molto potente, ma comunque semplice se si legge la documentazione e si imparano i vari comandi.

In questo topic vi mostrerò man mano i comandi più semplici, fino ad arrivare ai comandi più complessi per le persone più ambiziose che vogliano cimentarsi e approfondire meglio il discorso.

ImageMagick comprende una serie di programmi a riga di comando, ci sono anche graphics user interface per gli utenti meno inclini ad imparare direttamente con il terminale, io comunque opterò per la prima variante.


Il comando più usato e famoso di ImageMagick è convert.
Con convert potrete convertire le vostre immagini tra vari formati quali JPEG e PNG ( i più famosi ) oppure ridimensionare le immagini, ingrandirle, sfocarle, ritagliarle, insomma, tutte le cose che può fare un programma di image editing come GIMP o Photoshop, solo che fatto a riga di comando e con molta più precisione e immediatezza.

Partiamo con qualche comando semplice, ma soprattutto utile.

Per esempio, per convertire un'immagine JPEG in una immagine formato PNG, basta questo semplice comando.

Codice: Seleziona tutto

 convert img.jpg img.png 

Con convert è anche possibile specificare in input multiple immagini, così anche per l'output.

Quindi, se in una directory avete cinque immagini, ma ne volete solo convertire tre, quello che dovete fare è solamente specificare il nome del file delle singole immagini, l'ordine è irrilevante.

Codice: Seleziona tutto

 convert img1.jpg img2.jpg img3.jpg img1.png img2.png img3.png 
Ovvio che se specificate sia in input che in output lo stesso nome e lo stesso formato ( JPEG o PNG ), l'immagine verrà sovrascritta e non è certamente una cosa buona da fare, mettete caso che avete sbagliato non potete più recuperare l'immagine originale e rifare il procedimento, quindi state attenti.

Per evitare questo incoveniente, oltre che specificare nomi diversi se volete mantenere lo stesso formato, potete specificare più input separatamente ma un solo output con una notazione speciale, presa dai tipi di conversione in C stampabili in una stringa formattata, per esempio:

Codice: Seleziona tutto

 convert img1.jpg img2.jpg img3.jpg abc%02d.jpg 
%02d sono il numero di cifre usate per numerare le singole immagini nella sequenza di output, 2 indicano 1 * 10^2 immagini possibili in output, 3 indicano 1 * 10^3 immagini possibili in output, e così via...per farla breve, indica le cifre possibili dopo il nome della singola immagine, nel sistema posizionale decimale, quindi con due cifre, da 00 a 99.

Se invece avete bisogno di convertire tutte le immagini di uno stesso formato in un colpo solo la cosa è ancora più facile, ricordatevi di usare la notazione precedente e stare attenti a evitare di generare dei casi in cui i nomi delle immagini in input possano avere lo stesso nome di quelle in output.

Codice: Seleziona tutto

 convert *.jpg abc%02.jpg 
Ovvio che sapendo già quante sono le immagini in una cartella, regolate la notazione %nd di conseguenza, per evitare che il programma generi comportamenti indesiderati.



Un altro comando utilissimo è quello di poter salvare una o più immagini in output dati degli URL di immagini hostate su internet, per esempio:

Codice: Seleziona tutto

 convert http://www.sito.it/immagine1.jpg http://www.sito.it/immagine2.jpg http://www.sito.it/immagine1.jpg img%02d.jpg 

Altri comandi utili e semplici per adesso non mi vengono in mente.


Ultimo esempio e per oggi ci fermiamo qua: il comando montage.

Il comando montage prende in input una sequenza di immagini e crea in output un'unica immagine composta con tutte le immagini fornite in input, i famosi "thumbnails" in parole povere.

Un esempio molto semplice può essere il seguente

Codice: Seleziona tutto

 montage img1.jpg img2.jpg img3.jpg img4.jpg -tile 2x2 -border 0 -geometry +0 out.jpg 
Questo esempio crea un'unica immagine composta dalla sequenza delle immagini in input e crea una immagine "thumbnails", 2 immagini per riga, le singole immagini non hanno bordo e sono posizionate senza nessuna particolare geometria.

Qua bisogna soffermarsi un attimo sulle opzioni del comando.

-tile indica la disposizione delle singole immagini nell'immagine finale, il primo numero indica le colonne, il secondo le righe.

-border specifica lo spessore dei bordi delle singole immagini, se volete per esempio distanziarle; farò degli esempi più precisi più avanti.

-geometry indica la geometria dell'immagine finale e come verranno visualizzate le singole immagini nell'immagine finale. -geometry 0 fa sì per esempio che le singole immagini in input non sia scalate ( rese più piccole o grandi ) e di consequenza senza che ci rimetta anche la grandezza dell'immagine composta finale.


Finito per oggi. Saluti.

Avatar utente
+Fracassato+
Bannato
Bannato
Messaggi: 3406
Iscritto il: 28/06/2011, 16:24
Località: Copyright ©

Re: ImageMagick

#2 Messaggio da +Fracassato+ »

Rieccomi qua a spiegarvi un esempio più elaborato per creare thumbnails in serie in un'unica immagine come le classiche anteprime dei video che potete vedere su internet.

Passo 1

Aprite il vostro terminale e posizionatevi nella cartella in cui si trova il vostro file video da cui volete estrarre una serie di immagini per poi creare l'anteprima in un unico file immagine.
Per fare ciò ci serviremo di Fmpeg.

Codice: Seleziona tutto

ffmpeg -i esemio.mp4 -vf fps=' 30 / ( minuti * 60 + secondi )' -c:v libwebp -lossless 1 -pix_fmt yuv420p -y img%02d.webp
Il filtro per le tracce video fps scrive in output un immagine ogni tot secondi in base all'espressione specificata dall'argomento di fps.
Nel nostro esempio vogliamo scritte 30 immagini totali, perciò facciamo il rapporto tra le 30 immagini e i secondi totali della traccia video.

In realtà non so bene ancora perché ma la immagini scritte in output sono sempre n + 1, forse l'espressione una volta valutata sfora il tempo totale della traccia video e "frega" - per modo di dire - il filtro che scrive una immagine in più, ovviamente completamente nera che cancellerete.

Una volta avute le vostre 30 immagini dovremmo usare una serie di comandi della suite di ImageMagick.


Passo 2

Codice: Seleziona tutto


montage *.webp -background none -border 0 -geometry +4+4 -shadow -tile 5x6 \
-define filter=Catrom -define filter:b=-0.5 -define filter:c=0.25 -resize 25% \
-define webp:lossless=true -quality 100 webp:3.webp

Immagine

Con il comando montage abbiamo preso in input tutte le immagini con estensione .webp estratte con ffmpeg e le abbiamo unite in un'unica immagine creando un unico file.

Codice: Seleziona tutto

-background none                  fa sì che l'immagine non abbia nessun colore di sfondo. Capirete poi il perché.

Codice: Seleziona tutto

-border 0                               implica che l'immagine non ha bordi di nessun tipo

Codice: Seleziona tutto

-geometry +4+4                     indica l'offset delle singole immagini nell'immagine finale. È utile per distanziare le singoli immagini una dall'altra.

Codice: Seleziona tutto

-shadow                                applica un effetto ombra alle immagini. Non necessario ma esteticamente piacevole.

Codice: Seleziona tutto

-tile 5x6                                 indica al programma di disporre le 30 immagini in una matrice di 5 colonne ognuna aventi 6 righe

Codice: Seleziona tutto

-define filter=Catrom -define filter:b=-0.5 -define filter:c=0.25 -resize 25%                      sono una serie di definizioni che specificano il filtro e le opzioni del filtro da usare quando si scalano le immagini. resize 25% scala ogni singola immagine a 1/4 della sua dimensione originale.

Codice: Seleziona tutto

-define webp:lossless=true -quality 100 webp:3.webp                     definisce una serie di opzioni per codificare l'immagine webp in un formato lossless. Utile quando non si ha ancora l'immagine finale e non si vuole nessuna perdita di informazione durante le varie operazioni. -quality specifica una scala di valori usata per determinare il metodo di compressione usato per comprimere le immagini. Sì, anche le immagini lossless ( senza perdita ) possono essere compresse. Un valore più alto di quality permette una compressione maggiore ma richiede più tempo, valori più bassi minore compressione ma meno tempo di esecuzione. A voi la scelta.

Passo 3
Create l'immagine che riporti le informazioni di base del file video.
Questo passo potrebbe essere automatizzato e incorporato in un altro comando, ma non ho ancora trovato il modo per farlo.

Nel nostro caso tenete presente la larghezza dell'immagine precedente e create la nuova immagine con pochi meno pixels in modo da assere allineata con le singole immagini.
Adesso capirete meglio.

Codice: Seleziona tutto


convert -size 1636x100 xc:white -font Helvetica -pointsize 20  \
        -gravity NorthWest -fill black -annotate +11+11 "Name: 62f904fdf2.mp4\nDuration: 00:37:26.67, start: 0.000000, bitrate: 4674 kb/s\n" -blur 0x4 \
        -gravity NorthWest -fill black -annotate +8+8 "Name: 62f904fdf2.mp4\nDuration: 00:37:26.67, start: 0.000000, bitrate: 4674 kb/s\n" \
        -define webp:lossless=true -quality 100 webp:1.webp

Immagine

Il font è a piacimento. pointsize indica la grandezza del font. -gravity indica che la scritta sia posizionata il alto a sinistra rispetto il centro dell'immagine. -fill colora la scritta di nero. -annotate indica la scritta da scrivere +11+11 è l'offset. Nel mio caso l'ho specificata due volte per creare l'effetto shadow manualmente. L'ultima riga ha lo stesso significato dato per l'immagine precedente.


Passo 4

Codice: Seleziona tutto

convert -border 4 -bordercolor black 1.webp -define webp:lossless=true -quality 100 webp:2.webp
Immagine

Aggiunge dei bordi neri all'immagine.

Anche questo passo può essere automatizzato, ma facendolo nel passo 3 non ho ancora capito bene il meccanismo ma sfoca i bordi dell'immagine.


Passo finale

Codice: Seleziona tutto


montage 2.webp -mode concatenate 3.webp -geometry +4+4 -tile 1x -shadow -background "rgb(255, 126, 255)" -define webp:lossless=true -quality 100 webp:4.webp

Nel passo finale prendiamo in input l'immagine create tramite i passi 3 e 4 e la concateniamo verticalmente con l'immagine del passo 2. Aggiungiamo ancora l'ombra ( shadow ) e poi specifichiamo il colore di sfondo.

Ecco il risultato finale.

Immagine

Rispondi

Torna a “InformaticHard”