Come faccio a creare una gif animata da immagini fisse (preferibilmente con la riga di comando)?


78

Voglio creare un'immagine .gifanimata da un determinato set di .jpgimmagini.

Preferirei farlo dalla riga di comando, quindi gli strumenti della riga di comando sarebbero i benvenuti.


Risposte:


87

È possibile utilizzare il pacchetto ImageMagick . Installalo usando il comando:

sudo apt-get install imagemagick

Ora puoi creare un gifnumero di immagini ( jpg) usando:

convert -delay 20 -loop 0 *.jpg myimage.gif

6
Per favore, includi qui come ridimensionare l'animazione GIF ecc. Del 50%. Ecc -resize 50%.
Léo Léopold Hertz

Ubuntu 18.10 non è riuscito con "risorse cache esaurite" per queste immagini: github.com/cirosantilli/media/blob/master/… correlati: superuser.com/questions/1178666/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Gli utenti ImageMagick probabilmente anche voler: -deconstruct. Ho anche scoperto che ImageMagick ha molta fame di memoria, vedi i benchmark: askubuntu.com/a/1102183/52975
Ciro Santilli 23 改造 中心 法轮功 六四 事件

convert -delay 0 -loop 0 *.tif myanimated.gifha funzionato bene, su 720 file tif
ron

46

Per completare la risposta di @Maythux:

Per evitare di generare un file molto grande, puoi usare l' -resizeopzione:

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

Prenditi cura di * .jpg

*.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 -tad esempio. Su Ubuntu puoi ls -vinvece 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.


4
Puoi evitare il tuo problema * .jpg inoltrando i numeri di riempimento con zeri. "01.jpg" invece di "1.jpg" e così via. Se arrivate a triple cifre, quindi "001.jpg", "010.jpg", ecc.
bigreddmachine,

2
Esistono diversi modi per aggirare il problema della sequenza dei nomi di file. Tra cui find, sort, espansione delle parentesi graffe, e così via. Lo lsstrumento è notoriamente inadatto a questo tipo di cose. Usa find. C'è un po 'di una curva di apprendimento, ma ne vale la pena.
esprime il

Alcuni utenti potrebbero essere interessati a modificare i nomi dei file con massren: github.com/laurent22/massren
Graham P Heath

ci vogliono anni per finire. C'è un'opzione dettagliata?
ouranos,

21

Non ho abbastanza reputazione per commentare ma invece di modificare i nomi dei file puoi usare globbing per ottenere la shell per espandere i nomi dei file

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif

11

GIMP

Puoi farlo facilmente con GIMP. Prima installalo se non è già installato con

sudo apt-get install gimp

Creare la gif

Da GIMP vai su File -> Apri come livelli per aprire tutti i png sul proprio livello.

Apri come 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.

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

Opzioni di esportazione GIF


7

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

inserisci qui la descrizione dell'immagine

Le ffmpegopzioni 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.gifdice 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.xmlcome 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.

    ffmpegcalcola queste differenze per impostazione predefinita, ma ImageMagick no, a meno che non -deconstructvenga 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 516x516posto 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:

  • ImageMagick ha utilizzato 2,6 GB di RAM e ha impiegato circa 1 minuto
  • ffmpeg ha usato 100 Mb di RAM e ha impiegato 4 secondi

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.


Votato e apprezzato !, ottima risposta, ho una piccola domanda di follow-up. Non ho molte immagini di alta qualità, e non ho usato -r e -vcomandi, tuttavia l'output gif è di qualità molto inferiore rispetto ai file png originali. Come mantenere la stessa qualità di gif dei file png dati?
astro123

Ciao @ astro123 come è la qualità inferiore? Dimensioni dell'immagine più piccole, o meno fotogrammi o qualcos'altro (GIF utilizza apparentemente senza perdita, quindi non può essere una compressione peggiore)? Prova -framerate 60 -r 60. Ispeziona la GIF generata e inserisci le immagini con gli strumenti di ImageMagick come identifyprovare a capire cosa sta succedendo.
Ciro Santilli 10 改造 中心 法轮功 六四 事件

4

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


1
Come posso fare 40 immagini PNG in una GIF in loop? Tutto nella cartella / home / fusion809 / Documents / Images
BH2017

1
@ BH2017: convert -delay 20 -loop 0 *.png out.gifcrea una GIF in loop.
unutbu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.