Creazione di un'animazione GIF da file PNG


83

Esiste uno strumento per creare gifun'animazione da un set di pngfile?

Ho provato il convertcomando dalla suite ImageMagick , ma questo non sempre riesce. Inoltre, ho diversi problemi con questo:

  1. Non so dire quali siano i progressi.
  2. Indipendentemente da ciò che provo, la -delaybandiera non cambia la frequenza dei fotogrammi dell'animazione GIF.
  3. convertdetermina l'ordine dei fotogrammi in base all'ordine alfabetico dei nomi dei file. Ciò significa che name500.pngverrà inserito subito dopo name50.pnge non dopo name450.pngche posso risolvere questo problema aggiungendo 0 ma questo è fastidioso.

[Notizie] Esiste una massiccia sovrapposizione tra Ubuntu Stackexchange e Unix Stackexchange. Ho provato a classificare alcuni thread qui .
hhh,

Per quanto riguarda l'articolo 3., è ancora possibile utilizzare convertdopo l'ordinamento dei file. Probabilmente qualcosa del genere funzionafiles=$(ls name*png | sort -n -tname -k1); convert $files animation.gif
altroware l'

Per il punto 1: convert ha un -monitorparametro che tiene traccia del processo
Chiurlo il

@hhc - tutta la categorizzazione è solo un collegamento a una risposta con 5 collegamenti; solo uno di questi sembra correlato, ma è solo un collegamento alla domanda di cui sopra. - Un commento di @Luke dà una soluzione semplice: convert -delay 200 -loop 0 *.jpg output.gif.
cipricus

Risposte:


50

Le versioni più recenti di ffmpeg non hanno -sameq ( vedi faq ) ma hanno il supporto GIF.

ffmpeg -i %03d.png output.gif

Dove% 03d è l'ID frame in 3 cifre.

Puoi anche provare a utilizzare ffmpegper creare un filmato da una sequenza di immagini e quindi convertire il filmato in un'animazione GIF (usando di nuovo ffmpeg).

# cf. http://pages.uoregon.edu/noeckel/MakeMovie.html

# first convert an image sequence to a movie
ffmpeg -sameq -i %03d.jpg output.mp4

# ... and then convert the movie to a GIF animation
ffmpeg -i output.mp4 -pix_fmt rgb24 -s qcif -loop_output 0 output.gif

10
Questa istruzione non è aggiornata.
manutenzione

3
L' sameqopzione non è più disponibile. Inoltre, per me, questo sovrascrive i file di immagine originali e non produce un file di film valido.
Lode

Qual è il punto di lasciare -sameqlì il codice? Perché dovresti persino utilizzare un formato video con perdita ( output.mp4) come temporaneo? E se sì, perché "stessa qualità" dell'input, anziché bitrate molto elevato? Ciò potrebbe peggiorare le cose per il codificatore GIF. Se avessi bisogno di usare un video come temporaneo, ti consigliamo di utilizzare qualcosa senza perdita di dati come Huffyuv. O MJPEG senza transcodifica, basta rimodellare i jpeg di input in un MJPEG. ( -codec:video copy).
Peter Cordes,

80

convertè un utile strumento da riga di comando per farlo. cdnella cartella contenente i tuoi png -files ed esegui questo comando:

convert -delay 10 -loop 0 *.png animation.gif

Fonte: http://ubuntuforums.org/showthread.php?t=1132058


5
La domanda menziona converte alcuni problemi nell'usarlo. La tua risposta non si rivolge a nessuno di essi.
Mat,

3
A partire dalla versione di ImageMagick ha 6.8.7-4 2013-11-02 Q16funzionato per me.
Rudy Matela,

7
Funziona, ma 10significa 10 * 10 ms, quindi abbastanza veloce. Un ritardo di a 100è di 1 secondo.
Anne van Rossum,

7
usa l'opzione -dispose previouso -dispose 2se stai lavorando con PNG trasparenti
Hải Phong

4
nota a me stesso: l' espansione della parentesi graffa può essere utile per specificare l'elenco di immagini come argomenti, ad esempio si pic_{0..20..2}.pngespande pic_0.png, pic_2.pngfino apic_20.png
Yibo Yang,

19

La convert's --delay' opzione è valida solo per l'immagine successiva sulla riga di comando. Quindi convert -delay 10 *imposterà solo il ritardo del primo fotogramma su 0,1 secondi. L'opzione deve essere ripetuta:

convert $(for a in *; do printf -- "-delay 10 %s " $a; done; ) result.gif

Per le tue esigenze di ordinamento, convert non ordina i frame, lo *fa il globing della shell . Se sai che i tuoi frame sono numerati da 0 a 700, puoi semplicemente calcolare i numeri da solo:

convert $(for ((a=0; a<700; a++)); do printf -- "-delay 10 name%s.png " $a; done;) result.gif

5
Non ho questo comportamento con convert, per me convert -delay 1000 -loop 0 *.png animation.gifaggiunge un ritardo di 10 secondi tra ogni immagine.
Lode

1
È inoltre possibile utilizzare l' ordinamento versione del lscomando. Cioè:convert -delay 1000 $(ls -v name*png) output.gif
erik,

7

Aggiornare:

Usa convertper il png-to-gif, quindi usa gifsicle per l'animazione. Non è una soluzione One App To Do It All, ma sicuramente utilizzabile tramite script.


GIMP è in grado di creare gif animate e fornisce il controllo di temporizzazione / ritardo e ripetizione, ecc


4
Conosco il gimp ma non so come scriverlo. Inoltre, usare gimp per creare animazioni è come uccidere una mosca con un cannone
Yotam

1
Questa è una cattiva idea; la qualità sarà orribile, poiché ogni fotogramma verrà quantizzato separatamente.
Clément,

2

ImageMagick può generare animazioni gif di buona qualità. Guarda questo video: http://www.youtube.com/watch?v=OFusYizJ-bA


6
Benvenuti in Unix e Linux! In generale, ci piace che le risposte sul sito siano in grado di resistere da sole - I collegamenti sono fantastici, ma se quel collegamento si rompe la risposta dovrebbe avere abbastanza informazioni per essere ancora utile. Si prega di considerare la modifica della risposta per includere ulteriori dettagli. Vedi le FAQ per maggiori informazioni.
slm

Che commento utile sopra ....
Luca

1
convert -delay 200 -loop 0 *.jpg output.gif
Luca,

@Luke - di tutto il caos pubblicato sotto questa domanda il tuo commento è stato molto utile
cipricus

2

ffmeg importanti opzioni GIF + dati di test

Per completare questa risposta :

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
ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i 'tmp.*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

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

Le ffmpegopzioni importanti che ho voluto evidenziare sono:

  • -patter_type glob: modo conveniente per selezionare le immagini
  • -framerate 60e -r 15: assumere 60 FPS sulle immagini di input ( ffmpegnon si può sapere altrimenti poiché nessun dato FPS nelle immagini come nei formati video), sceglierne uno ogni 4 immagini in modo da ridurne le dimensioni ( 4 == 60 / 15)
  • -vf scale=512:-1: imposta la larghezza, l'altezza della scala proporzionalmente, di solito per ridurre le dimensioni e risparmiare spazio

Guarda anche:

Testato in Ubuntu 18.10, ffmpeg 4.0.2.


-1

Per quanto riguarda il punto 2

La versione di ImageMagick "display" I have (ImageMagick 6.7.2-7 2017-01-12) ignora il frame rate impostato usando il comando convert per produrre il GIF animato. Prova un altro programma per visualizzare l'animazione GIF come Firefox.

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.