Voglio creare un'immagine .gif
animata da un determinato set di .jpg
immagini.
Preferirei farlo dalla riga di comando, quindi gli strumenti della riga di comando sarebbero i benvenuti.
Voglio creare un'immagine .gif
animata da un determinato set di .jpg
immagini.
Preferirei farlo dalla riga di comando, quindi gli strumenti della riga di comando sarebbero i benvenuti.
Risposte:
È possibile utilizzare il pacchetto ImageMagick . Installalo usando il comando:
sudo apt-get install imagemagick
Ora puoi creare un gif
numero di immagini ( jpg
) usando:
convert -delay 20 -loop 0 *.jpg myimage.gif
-resize 50%
.
-deconstruct
. Ho anche scoperto che ImageMagick ha molta fame di memoria, vedi i benchmark: askubuntu.com/a/1102183/52975
convert -delay 0 -loop 0 *.tif myanimated.gif
ha funzionato bene, su 720 file tif
Per completare la risposta di @Maythux:
-resize
opzione:Nel mio caso, ho 4608x3456 immagini e la gif generata era più di 300M per 32 immagini
convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif
o
convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif
*.jpg
fa un po 'schifo quando si ha a che fare con valori numerici, è possibile generare una gif con foto non ordinate.
$ ls|cat
21-33-26_1.jpg
21-33-26_10.jpg // <--- this one
21-33-26_2.jpg
21-33-26_3.jpg
21-33-26_4.jpg
21-33-26_5.jpg
21-33-26_6.jpg
21-33-26_7.jpg
21-33-26_8.jpg
21-33-26_9.jpg
21-33-28_1.jpg // <--- should be here
21-33-28_2.jpg
21-33-28_3.jpg
...
Dato che gli scatti sono stati eseguiti molto rapidamente (10 / s), tutti hanno lo stesso tempo di modifica e non si può ingannare usando ls -t
ad esempio. Su Ubuntu puoi ls -v
invece usare qualcosa come:
convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif
L'ordinamento numerico è piuttosto complicato su Mac OS X, suppongo che dovrai creare uno script personalizzato.
find
, sort
, espansione delle parentesi graffe, e così via. Lo ls
strumento è notoriamente inadatto a questo tipo di cose. Usa find
. C'è un po 'di una curva di apprendimento, ma ne vale la pena.
Puoi farlo facilmente con GIMP. Prima installalo se non è già installato con
sudo apt-get install gimp
Da GIMP vai su File -> Apri come livelli per aprire tutti i png sul proprio livello.
Da qui puoi eseguire le modifiche sui livelli e, una volta fatto, vai su File -> Esporta come . Dalla finestra di dialogo assicurarsi di impostare il tipo di file su GIF.
Da lì andrai alle opzioni di esportazione GIF. Seleziona l' opzione " Come animazione " e imposta i parametri come richiesto.
Soluzione ffmeg + dati di test
A partire da Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8, ho scoperto che ffmpeg è molto più veloce e utilizza molta meno memoria .
Il comando di conversione più semplice è:
ffmpeg \
-framerate 60 \
-pattern_type glob \
-i '*.png' \
-r 15 \
-vf scale=512:-1 \
out.gif \
;
Puoi ottenere i miei dati di test con:
wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
I dati del test sono stati generati con: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292 e contiene 256 immagini PNG 1024x1024.
Ed ecco altri dati di test che puoi generare direttamente nel tuo browser proprio ora! https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718
Le ffmpeg
opzioni importanti che voglio evidenziare sono:
-pattern_type glob
: modo conveniente per selezionare le immagini
-framerate 60
: assume 60 FPS sulle immagini di input e produce lo stesso FPS.
ffmpeg
non può sapere diversamente, poiché non vi sono dati FPS nelle immagini come nei formati video.
Il completamento dei 256 frame di input richiede circa 4 secondi.
-r 15
: facoltativo. Scegli una ogni 4 immagini in modo da ridurne le dimensioni ( 4 == 60 / 15
).
Con esso, identify out.gif
dice che la GIF contiene solo 64 fotogrammi.
Ci vogliono ancora 4 secondi per giocare, quindi il ritardo viene modificato per far combaciare le cose.
-vf scale=512:-1
: facoltativo. Impostare la larghezza, l'altezza della scala in modo proporzionale, di solito per ridurre le dimensioni e risparmiare spazio.
Per far funzionare ImageMagick, per prima cosa ho dovuto modificare i limiti del disco e della memoria /etc/ImageMagick-6/policy.xml
come spiegato in: https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages
Guarda anche:
Benchmark ImageMagick vs ffmpeg
Ho confrontato i comandi:
/usr/bin/time -v convert *.png -deconstruct -delay 1.6 out-convert.gif
/usr/bin/time -v ffmpeg \
-framerate 60 \
-pattern_type glob \
-i '*.png' \
out-ffmpeg.gif \
;
I comandi sono stati costruiti per produrre output il più vicino possibile per rendere valido il confronto:
/usr/bin/time -v
: usato per trovare il massimo utilizzo della memoria come spiegato su: https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process
-deconstruct
: Le immagini GIF possono contenere solo il rettangolo modificato minimo del fotogramma precedente per ridurre le dimensioni della GIF.
ffmpeg
calcola queste differenze per impostazione predefinita, ma ImageMagick no, a meno che non -deconstruct
venga utilizzato.
Fondamentalmente vorrai usare questa opzione ogni volta con ImageMagick.
Possiamo osservare la differenza con:
identify out.gif
Con la versione compressa, tutti i frame hanno dimensioni inferiori rispetto a quello iniziale, ad esempio:
out.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
out.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
In questo esempio, il secondo fotogramma è solo al 516x516
posto dell'intero 1024x1024 e viene posizionato su un offset di 252+257
. Quindi contiene solo il triangolo centrale.
Vedi anche: come posso ridimensionare un file GIF animato usando ImageMagick?
-delay
: valore corrispondente a 60FPS di ffmpeg
. Non dovrebbe importare per le prestazioni di conversione, ma non voglio rischiare.
Le GIF di output hanno circa le stesse dimensioni e appaiono visivamente identiche.
Otteniamo per ImageMagick:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856
e per ffmpeg:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172
da cui vediamo che:
Hardware di prova: laptop Lenovo ThinkPad P51 , Intel Core i7-7820HQ, 32 GB (16 + 16) DDR4 SODIMM 2400 MHz, 512 GB SSD PCIe TLC OPAL2.
-r
e -v
comandi, tuttavia l'output gif è di qualità molto inferiore rispetto ai file png originali. Come mantenere la stessa qualità di gif dei file png dati?
-framerate 60 -r 60
. Ispeziona la GIF generata e inserisci le immagini con gli strumenti di ImageMagick come identify
provare a capire cosa sta succedendo.
Puoi usare un programma chiamato convert incluso nel pacchetto imagemagick. È guidato dalla riga di comando, ma molto facile da usare. Installalo tramite il software center oppure vai al prompt dei comandi e digita
sudo apt-get install imagemagick
Ora per creare il .gif.
convert -delay 100 -size 100x100 xc:SkyBlue \
-page +5+10 balloon.gif -page +35+30 medical.gif \
-page +62+50 present.gif -page +10+55 shading.gif \
-loop 0 animation.gif
* Nota che l'esempio sopra è direttamente dagli esempi di Image Magick
convert -delay 20 -loop 0 *.png out.gif
crea una GIF in loop.