web-dev-qa-db-fra.com

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

Je souhaite créer une image animée .gif à partir d'un ensemble donné d'images .jpg.

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

67
Maythux

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

Sudo apt-get install imagemagick

Vous pouvez maintenant créer un gifà partir du nombre d'images (jpgname__) en utilisant:

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

Pour compléter la réponse de Maythux:

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

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 est un peu nul en ce qui concerne les 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
...

Les prises de vues ayant é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 -t par exemple. Sur Ubuntu, vous pouvez utiliser ls -v à la place, par exemple:

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 aurez besoin de créer un script personnalisé.

43
Ninsuo

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

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

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 est sur leur propre couche.

Open as Layer

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

Set file type to 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.

GIF export options

6
chesedo

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 de Exemples d'Image Magick

3
Scott Goodgame

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-rile-14324292#14324292 et contient 256 images PNG 1024x1024.

Les importantes options ffmpeg que je souhaite mettre en évidence sont les suivantes:

  • -patter_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.

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

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

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

    identify out.gif indique que le fichier 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: facultatif. 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, je devais d'abord modifier ses limites de disque et de mémoire à /etc/ImageMagick-6/policy.xml comme expliqué à: https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

Voir également:

ImageMagick vs ffmpeg benchmark

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é à: https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process

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

    ffmpeg calcule ces diffs par défaut, mais ImageMagick ne le fait pas, sauf si -deconstruct est 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 ne contient que 516x516 au lieu de la résolution 1024x1024 complète et est placée à un décalage de 252+257. Il ne contient donc que le triangle moyen.

    Voir aussi: comment puis-je redimensionner un fichier GIF animé avec 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 a utilisé 2,6 Go de RAM et a pris environ une minute
  • ffmpeg a utilisé 100 Mo de RAM et a pris 4 secondes

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