J'ai besoin de quelque chose qui puisse être scripté sur Windows 7. Cette image sera utilisée dans les bannières.
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.
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:
Avec ImageMagick:
convert *.png a.gif
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
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.
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