Création d'une animation GIF à partir de fichiers PNG


83

Existe-t-il un outil pour créer une gifanimation à partir d'un ensemble de pngfichiers?

J'ai essayé la convertcommande de la suite ImageMagick , mais cela ne réussit pas toujours. En outre, j'ai plusieurs problèmes avec ceci:

  1. Je ne peux pas dire quels sont les progrès.
  2. Quoi que j'essaye, le -delaydrapeau ne change pas le taux de trame de l'animation gif.
  3. convertdétermine l'ordre des images en fonction de l'ordre alphabétique des noms de fichiers. Cela signifie que ce name500.pngsera placé juste après name50.pnget pas après que name450.pngje puisse résoudre ce problème en ajoutant des 0 mais c'est ennuyeux.

[Actualités] Il existe un énorme chevauchement entre Ubuntu Stackexchange et Unix Stackexchange. J'ai essayé de classer certains fils ici .
hhh

En ce qui concerne le point 3., vous pouvez toujours utiliser convertaprès le tri des fichiers. Probablement, quelque chose comme ça marchefiles=$(ls name*png | sort -n -tname -k1); convert $files animation.gif
altroware

Pour le point 1: convert a un -monitorparamètre qui suit le processus
Curlew

@hhc - toute la catégorisation est juste un lien vers une réponse avec 5 liens; un seul d'entre eux semble lié, mais est juste un lien vers la question ci-dessus. - Un commentaire par @Luke donne une solution simple: convert -delay 200 -loop 0 *.jpg output.gif.
cipricus

Réponses:


50

Les versions les plus récentes de ffmpeg ne possèdent pas -sameq ( voir la FAQ ) mais prennent en charge le format GIF.

ffmpeg -i %03d.png output.gif

Où% 03d est l'identifiant de la trame en 3 chiffres.

Vous pouvez également essayer d’utiliser ffmpegpour créer un film à partir d’une séquence d’images, puis convertir le film en animation GIF (à nouveau avec 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
Cette instruction est obsolète.
entretien élevé

3
L' sameqoption n'est plus disponible. De plus, pour moi, cela écrase les fichiers d’image originaux et ne produit pas de fichier vidéo valide.
Lode

Quel est l'intérêt de laisser le -sameqcode là-bas? Pourquoi voudriez-vous même utiliser un format vidéo avec perte ( output.mp4) à titre temporaire? Et si oui, pourquoi "même qualité" que l'entrée, au lieu d'un débit très élevé? Cela ne fera qu'empirer les choses pour le codeur GIF. Si vous aviez besoin d'utiliser une vidéo à titre temporaire, vous voudriez utiliser quelque chose sans perte comme huffyuv. Ou MJPEG sans transcodage, il suffit de remuxer les jpeg d’entrée dans un MJPEG. ( -codec:video copy)
Peter Cordes

80

convertest un outil pratique en ligne de commande pour le faire. cddans le dossier contenant vos fichiers png et exécutez la commande suivante:

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

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


5
La question mentionne convertet quelques problèmes d'utilisation. Votre réponse ne répond à aucun d'entre eux.
Mat

3
À partir de la version ImageMagick, 6.8.7-4 2013-11-02 Q16cela a fonctionné pour moi.
Rudy Matela

7
Cela fonctionne, mais 10signifie 10 * 10ms, donc assez vite. Un délai de a 100est 1 seconde.
Anne van Rossum

7
utiliser l'option -dispose previousou -dispose 2si vous travaillez avec des PNG transparents
Hải Phong

4
Note à moi - même: expansion des accolades peut être utile pour spécifier la liste des images comme arguments, par exemple se pic_{0..20..2}.pngdéveloppe pour pic_0.png, pic_2.pngtout le chemin àpic_20.png
Yibo Yang

19

Le convert« s --delayoption ne concerne que l'image suivante sur la ligne de commande. Ainsi convert -delay 10 *, le délai de la première image ne sera réglé qu'à 0,1 seconde. L'option doit être répétée:

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

Pour vos besoins de tri, convertir ne trie pas les cadres, mais le globing de shell le *fait. Si vous savez que vos images sont numérotées de 0 à 700, vous pouvez simplement calculer les nombres vous-même:

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

5
Je ne rencontre pas ce problème avec convert, pour moi convert -delay 1000 -loop 0 *.png animation.gifajoute un délai de 10 secondes entre chaque image.
Lode

1
Vous pouvez également utiliser le type de version de la lscommande. C'est-à-dire:convert -delay 1000 $(ls -v name*png) output.gif
erik

7

Mise à jour:

Utilisez convertpour le png-to-gif, puis utilisez gifsicle pour l'animation. Ce n'est pas une solution unique, mais scriptable, bien sûr.


GIMP peut créer des gifs animés et permet de contrôler le chronométrage / retard et la répétition, etc.


4
Je connais le Gimp mais je ne sais pas comment le scripter. En outre, utiliser l'anomalie pour créer une animation est comme tuer une mouche avec un canon
Yotam

1
C'est une mauvaise idée la qualité sera horrible, chaque image étant quantifiée séparément.
Clément

2

ImageMagick peut générer une animation GIF de bonne qualité. Regardez cette vidéo - http://www.youtube.com/watch?v=OFusYizJ-bA


6
Bienvenue sur Unix & Linux! Généralement, nous aimons que les réponses sur le site puissent être autonomes - Les liens sont excellents, mais si ce lien se brise, la réponse devrait avoir suffisamment d’informations pour être toujours utile. Pensez à modifier votre réponse pour inclure plus de détails. Voir la FAQ pour plus d'informations.
slm

Quel commentaire utile ci-dessus ...
Luke

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

@Luke - de tout le chaos affiché sous cette question, votre commentaire a été très utile
cipricus

2

ffmeg options GIF importantes + données de test

Pour compléter cette réponse :

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 \
;

Les données de test ont été générées avec: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Les ffmpegoptions importantes que je voulais souligner sont les suivantes:

  • -patter_type glob: moyen pratique de sélectionner des images
  • -framerate 60et -r 15: supposons 60 images par seconde sur les images en entrée ( ffmpegimpossible de le savoir car il n’ya pas de données FPS dans les images comme dans les formats vidéo), choisissez-en une toutes les 4 images afin de réduire la taille ( 4 == 60 / 15)
  • -vf scale=512:-1: définir la largeur, la hauteur de l'échelle proportionnellement, généralement pour réduire la taille et économiser de l'espace

Voir également:

Testé sous Ubuntu 18.10, ffmpeg 4.0.2.


-1

En ce qui concerne le point 2

La version d'ImageMagick "" display "que j'ai (ImageMagick 6.7.2-7 2017-01-12) ignore la cadence de prise de vue définie à l'aide de la commande convert pour générer le gif animé. Essayez un autre programme pour voir le gif animé comme Firefox.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.