Je veux faire une .gif
image animée à partir d'un ensemble donné d' .jpg
images.
Je préférerais le faire depuis la ligne de commande, les outils en ligne de commande seraient donc les bienvenus.
Je veux faire une .gif
image animée à partir d'un ensemble donné d' .jpg
images.
Je préférerais le faire depuis la ligne de commande, les outils en ligne de commande seraient donc les bienvenus.
Réponses:
Vous pouvez utiliser le package ImageMagick . Installez-le en utilisant la commande:
sudo apt-get install imagemagick
Vous pouvez maintenant créer un gif
nombre à partir d'images ( jpg
) en utilisant:
convert -delay 20 -loop 0 *.jpg myimage.gif
-resize 50%
.
-deconstruct
. J'ai également constaté qu'ImageMagick était très gourmand en mémoire, voir repères: askubuntu.com/a/1102183/52975
convert -delay 0 -loop 0 *.tif myanimated.gif
a bien fonctionné, sur 720 fichiers tif
Pour compléter la réponse de Maythux:
-resize
option: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
ç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 -t
par exemple. Sur Ubuntu, vous pouvez utiliser à la ls -v
place 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é.
find
, sort
, expansion des accolades, et ainsi de suite. L' ls
outil 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.
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 sur leur propre calque.
À 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.
De là, vous passerez aux options d'exportation GIF. Cochez l' option " En tant qu'animation " et définissez les paramètres comme requis.
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
Les ffmpeg
options 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.gif
dit 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.xml
comme 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.
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 516x516
remplace 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:
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.
-r
ni de -v
commandes, mais la sortie est toujours de qualité inférieure. Comment conserver la même qualité de gif que les fichiers png?
-framerate 60 -r 60
. Inspectez les images GIF générées et les images d'entrée à l'aide des outils ImageMagick, comme identify
pour essayer de comprendre ce qui se passe.
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
convert -delay 20 -loop 0 *.png out.gif
crée un GIF en boucle.