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.
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 (jpg
name__) en utilisant:
convert -delay 20 -loop 0 *.jpg myimage.gif
Pour compléter la réponse de Maythux:
-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
*.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é.
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
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
Depuis GIMP, allez dans Fichier -> Ouvrir en tant que calques pour ouvrir tous les png est sur leur propre couche.
À 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.
De là, vous passerez aux options d'exportation GIF. Cochez l'option ' en tant qu'animation ' et définissez les paramètres comme requis.
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
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:
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.