Comment créer un gif animé à partir d'images fixes (de préférence avec la ligne de commande)?

78

Je veux faire une .gifimage animée à partir d'un ensemble donné d' .jpgimages.

Je préférerais le faire depuis la ligne de commande, les outils en ligne de commande seraient donc les bienvenus.

Maythux
la source

Réponses:

88

Vous pouvez utiliser le package ImageMagick . Installez-le en utilisant la commande:

sudo apt-get install imagemagick

Vous pouvez maintenant créer un gifnombre à partir d'images ( jpg) en utilisant:

convert -delay 20 -loop 0 *.jpg myimage.gif
Maythux
la source
6
Veuillez inclure ici comment vous redimensionnez de 50% l’animation gif, etc. Etc -resize 50%.
Léo Léopold Hertz
Ubuntu 18.10 a échoué avec "ressources épuisées cache" pour ces images: github.com/cirosantilli/media/blob/master/... liées: superuser.com/questions/1178666/...
Ciro Santilli新疆改造中心法轮功六四事件
Les utilisateurs ImageMagick voudront probablement aussi: -deconstruct. J'ai également constaté qu'ImageMagick était très gourmand en mémoire, voir repères: askubuntu.com/a/1102183/52975
Ciro Santilli
convert -delay 0 -loop 0 *.tif myanimated.gifa bien fonctionné, sur 720 fichiers tif
ron
46

Pour compléter la réponse de Maythux:

Pour éviter de générer un très gros fichier, vous pouvez utiliser l' -resizeoption:

Dans mon cas, j'ai 4608x3456 images et le gif généré faisait plus de 300M pour 32 images

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

ou

convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif

Prenez soin de * .jpg

*.jpg ça craint un peu quand on a affaire à des valeurs numériques, vous pouvez générer un gif avec des images non triées.

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

Comme les prises de vue ont été prises très rapidement (10 / s), elles ont toutes le même temps de modification et vous ne pouvez pas tromper en utilisant ls -tpar exemple. Sur Ubuntu, vous pouvez utiliser à la ls -vplace quelque chose comme:

convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif

Le tri numérique est assez délicat sous Mac OS X, cependant, vous devrez créer un script personnalisé.

Ninsuo
la source
4
Vous pouvez éviter votre problème * .jpg en transmettant des chiffres de remplissage avec des zéros. "01.jpg" au lieu de "1.jpg", etc. Si vous arrivez à trois chiffres, alors "001.jpg", "010.jpg", etc.
bigreddmachine
2
Il existe plusieurs manières de résoudre le problème de la séquence de nom de fichier. Y compris find, sort, expansion des accolades, et ainsi de suite. L' lsoutil est notoirement inapproprié pour ce genre de chose. Utilisez find. Il y a un peu de courbe d'apprentissage, mais ça en vaut la peine.
voix
Certains utilisateurs pourraient être intéressés par l’édition des noms de fichiers avec massren: github.com/laurent22/massren
Graham P Heath
ça prend des siècles pour finir. Y a-t-il une option verbeuse?
ouranos
21

Je n'ai pas assez de réputation pour commenter, mais au lieu de modifier les noms de fichiers, vous pouvez utiliser Globbing pour que votre shell développe les noms de fichiers.

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

GIMP

Vous pouvez facilement le faire avec GIMP. Installez-le d'abord s'il n'est pas déjà installé avec

sudo apt-get install gimp

Créer le gif

Depuis GIMP, allez dans Fichier -> Ouvrir en tant que calques pour ouvrir tous les png sur leur propre calque.

Ouvrir comme couche

À partir de là, vous pouvez modifier les couches et, une fois cela fait, aller dans Fichier -> Exporter en tant que . Dans la boîte de dialogue, assurez-vous de définir le type de fichier sur GIF.

Définir le type de fichier sur GIF

De là, vous passerez aux options d'exportation GIF. Cochez l' option " En tant qu'animation " et définissez les paramètres comme requis.

Options d'exportation GIF

chesedo
la source
7

solution ffmeg + données de test

Depuis Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8, j'ai découvert que ffmpeg est beaucoup plus rapide et utilise beaucoup moins de mémoire .

La commande de conversion la plus simple est:

ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

Vous pouvez obtenir mes données de test avec:

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

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 et contiennent 256 images PNG 1024x1024.

Et voici une autre donnée de test que vous pouvez générer directement dans votre navigateur dès maintenant! https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718

entrez la description de l'image ici

Les ffmpegoptions importantes que je veux mettre en évidence sont les suivantes:

  • -pattern_type glob: moyen pratique de sélectionner des images

  • -framerate 60: supposons 60 images par seconde sur les images d'entrée et produisent le même nombre d'images par seconde.

    ffmpeg ne peut pas savoir autrement, car il n'y a pas de données FPS dans les images comme dans les formats vidéo.

    Les 256 images en entrée prennent environ 4 secondes.

    -r 15: optionnel. Choisissez-en une toutes les 4 images afin de réduire la taille ( 4 == 60 / 15).

    Avec cela, identify out.gifdit que le GIF ne contient que 64 images.

    Il faut encore 4 secondes pour jouer, le délai est donc modifié pour faire correspondre les choses.

  • -vf scale=512:-1: optionnel. Définissez la largeur et la hauteur de l'échelle proportionnellement, généralement pour réduire la taille et économiser de l'espace.

Pour que ImageMagick fonctionne, j'ai d'abord dû modifier ses limites en matière de disque et de mémoire, /etc/ImageMagick-6/policy.xmlcomme expliqué à l' adresse suivante : https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

Voir également:

ImageMagick vs repère ffmpeg

J'ai comparé les commandes:

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

Les commandes ont été construites pour produire des sorties aussi proches que possible afin de valider la comparaison:

  • /usr/bin/time -v: utilisé pour trouver l'utilisation maximale de la mémoire, comme expliqué à l' adresse suivante : https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process

  • -deconstruct: Les images GIF peuvent contenir uniquement le rectangle minimal modifié de l'image précédente pour réduire la taille du fichier GIF.

    ffmpegcalcule ces diffs par défaut, mais ImageMagick ne le fait pas, sauf si -deconstructest utilisé.

    En gros, vous voudrez utiliser cette option à chaque fois avec ImageMagick.

    Nous pouvons observer la différence avec:

    identify out.gif
    

    Avec la version compressée, toutes les images ont des tailles plus petites que la taille initiale, par exemple:

    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
    

    Dans cet exemple, la seconde image 516x516remplace uniquement le format 1024x1024 complet et est placée à un décalage de 252+257. Il ne contient donc que le triangle du milieu.

    Voir aussi: comment redimensionner un fichier GIF animé à l'aide d'ImageMagick?

  • -delay: valeur qui correspond aux 60 images par seconde de ffmpeg. Cela ne devrait pas avoir d’importance pour les performances de conversion, mais je ne veux pas le risquer.

Les fichiers GIF en sortie ont à peu près la même taille et sont visuellement identiques.

Nous obtenons pour ImageMagick:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856

et pour ffmpeg:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172

à partir de laquelle on voit que:

  • ImageMagick utilisait 2,6 Go de RAM et prenait environ 1 minute
  • ffmpeg a utilisé 100 Mo de RAM et a pris 4 secondes

Matériel de test: Ordinateur portable Lenovo ThinkPad P51 , Intel Core i7-7820HQ, 32 Go (16 + 16) SODIMM DDR4 2400 MHz, 512 Go SSD PCIe TLC OPAL2.

Ciro Santilli 改造 中心 六四 事件
la source
Vote positif et apprécié! Excellente réponse. J'ai une petite question de suivi. Je n'ai pas beaucoup d'images de haute qualité, et je n'ai pas utilisé de commandes -r ni de -vcommandes, mais la sortie est toujours de qualité inférieure. Comment conserver la même qualité de gif que les fichiers png?
astro123
Salut @ astro123, comment est la qualité inférieure? Une taille d'image plus petite, ou moins d'images, ou autre chose (le format GIF utilise apparemment sans perte, la compression ne peut donc pas être pire)? Essayez -framerate 60 -r 60. Inspectez les images GIF générées et les images d'entrée à l'aide des outils ImageMagick, comme identifypour essayer de comprendre ce qui se passe.
Ciro Santilli du
4

Vous pouvez utiliser un programme appelé convert inclus dans le paquet imagemagick. Il est géré par la ligne de commande, mais très facile à utiliser. Installez-le via le centre de logiciel ou accédez à une invite de commande et tapez

sudo apt-get install imagemagick

Maintenant, créez le .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

* Notez que l'exemple ci-dessus provient directement des exemples d' Image Magick

Scott Goodgame
la source
1
Comment créer 40 images PNG dans un fichier GIF en boucle? Tout dans dossier / accueil / fusion809 / Documents / Images
BH2017
1
@ BH2017: convert -delay 20 -loop 0 *.png out.gifcrée un GIF en boucle.
unutbu