web-dev-qa-db-fra.com

Créer un gif animé à partir d'un ensemble d'images JPEG

J'ai besoin de quelque chose qui puisse être scripté sur Windows 7. Cette image sera utilisée dans les bannières.

31
Cbox

Vous pouvez le faire avec ffmpeg

Convertissez d'abord les images en vidéo:

ffmpeg -f image2 -i image%d.jpg video.avi

(Cela convertira les images du répertoire actuel (nommé image1.jpg, image2.jpg ...) en un fichier vidéo nommé video.avi.)

Convertissez ensuite l'avi en gif:

ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif

Vous pouvez obtenir les binaires Windows pour ffmpeg ici .


Vous pouvez également faire une chose similaire avec mplayer . Voir Encodage à partir de plusieurs fichiers d'image d'entrée .

Je pense que la ligne de commande serait quelque chose comme:

mplayer mf://*.jpg -mf w=800:h=600:type=jpg -vf scale=160:120 -vo gif89a:fps=3:output=out.gif

(Où 800 et 600 sont la largeur et la hauteur de votre source et 160 et 120 la largeur et la hauteur cible.out.gif est le nom de votre fichier cible)


Je viens de tester les deux et ils fonctionnent tous les deux très bien. Cependant, j'ai obtenu de bien meilleurs résultats de mplayer car j'ai pu spécifier la résolution et la fréquence d'images. Votre kilométrage peut varier et je suis sûr que vous pourriez trouver plus d'options pour ffmpeg si vous regardiez.

47
Simon P Stevens

réponse de Simon P Stevens m'a presque amené là:

ffmpeg -f image2 -i image%d.jpg video.avi
ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif

Voyons voir si nous pouvons améliorer cela.

Passer par un avi n'est pas nécessaire. Un -pix_fmt De rgb24 N'est pas valide et l'option -loop_output Empêche le bouclage, ce que je ne veux pas. On a:

ffmpeg -f image2 -i image%d.jpg out.gif

Mes images en entrée sont étiquetées avec un nombre à 3 chiffres sans remplissage et j'en ai 30 (image_001.jpg, image_002.jpg, ...), donc je dois corriger le spécificateur de format

ffmpeg -f image2 -i image_%003d.jpg out.gif

Mes photos d'entrée proviennent de la caméra de mon téléphone, elles sont bien trop grandes! Je dois les réduire.

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299 out.gif

Je dois également les faire pivoter de 90 degrés dans le sens des aiguilles d'une montre

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif

Ce gif jouera avec un délai nul entre les images, ce qui n'est probablement pas ce que nous voulons. Spécifiez la fréquence d'images des images d'entrée

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif

L'image est juste un peu trop grande, donc je recadrerai 100 pixels de ciel. La transposition rend cela délicat, j'utilise les valeurs x et y post-tournées:

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1,crop=299,431,0,100 out.gif

Le résultat final - je partage avec le monde l'expression impressionnante de mon compagnon:

Example of an animated gif created with ffmpeg

69
dwurf

Avec ImageMagick:

convert *.png a.gif
35
psycho brm

Les ffmpeg à . Avi et .avi à . gif a fonctionné, mais la seule chose à noter est que vos images doivent être nommées en parfait augmenter l'ordre numérique pour fonctionner, sans lacunes. J'ai préparé un rapide script python pour renommer toutes mes images en conséquence afin que cette recette ffmpeg fonctionne:

import os

files = [ f for f in os.listdir('.') if os.path.isfile(os.path.join('.',f)) and f.endswith('.jpg') ]
for i, file in enumerate(sorted(files)):
    os.rename(file, 'image%03d.jpg' % i)

Et puis je suis tombé sur une approche beaucoup plus simple que ffmpeg pour faire la conversion, qui utilise simplement l'outil de conversion de ligne de commande d'ImageMagick comme celui-ci

convert image%03d.jpg[0-198] animated_gif.gif

Cela ne devient pas beaucoup plus simple que cela.

Gist here: https://Gist.github.com/328984

12

Sur la base des réponses de Simon P Stevens et de dwurf, j'ai trouvé cette solution simplifiée:

ffmpeg -f image2 -framerate 1 -i image%d.jpg video.gif

Il en résulte un taux de 1 seconde par image. Ajustez la valeur framerate en fonction de vos besoins.

5
luator

Je voudrais juste ajouter à la réponse de dwurf , que cela générera un gif avec la palette standard de 256 couleurs, qui n'a pas l'air très agréable visuellement.

J'ai trouvé deuxarticles de blog et les ai adaptés à mes besoins, afin d'améliorer la qualité visuelle en utilisant une palette personnalisée pour votre animation:

Générez la palette de couleurs:

ffmpeg -f image2 -i image%d.jpg -vf scale=900:-1:sws_dither=ed,palettegen palette.png

Convertissez des images en une vidéo ordinaire avec le taux de rafraîchissement souhaité, car la troisième commande ne fonctionnait qu'avec une seule vidéo d'entrée et non pas un tas d'images

ffmpeg.exe -f image2 -framerate 1.2 -i image%d.jpg video.flv

Maintenant, convertissez la vidéo générée avec la palette générée en un gif plus beau:

ffmpeg.exe -i video.flv -i palette.png -filter_complex "fps=1.2,scale=900:-1:flags=lanczos[x];[x][1:v]paletteuse" video.gif
3
Alexander Pacha