从一组jpeg图像创建动画gif

时间:2010-09-10 22:37:16

标签: windows animated-gif

我需要可以在Windows 7上编写脚本的内容。此图像将用于横幅。

6 个答案:

答案 0 :(得分:67)

Simon P Stevens' answer几乎把我带到了那里:

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

让我们看看我们是否能够做到这一点。

通过avi进行是不必要的。 -pix_fmt的{​​{1}}无效,而rgb24选项会阻止循环播放,这是我不想要的。我们得到:

-loop_output

我的输入图片标有零填充的3位数字,我有30个(image_001.jpg,image_002.jpg,...),所以我需要修复格式说明符

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

我的输入图片来自我的手机相机,它们太大了!我需要缩小它们。

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

我还需要顺时针旋转90度

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

这个gif将在帧之间零延迟播放,这可能不是我们想要的。指定输入图像的帧速率

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

图像太大了,所以我会裁剪出100像素的天空。转置使这很棘手,我使用后旋转的x和y值:

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

最终结果 - 我与世界分享了我的伴侣的精彩面部表情:

Example of an animated gif created with ffmpeg

答案 1 :(得分:45)

您可以使用ffmpeg

执行此操作

首先将图像转换为视频:

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

(这会将当前目录中的图像(名为image1.jpg,image2.jpg ...)转换为名为video.avi的视频文件。)

然后将avi转换为gif:

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

您可以获得windows binaries for ffmpeg here


您也可以使用mplayer执行类似的操作。请参阅Encoding from multiple input image files

我认为命令行会是这样的:

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

(其中800& 600是您的来源宽度和高度,160& 120是目标宽度和height.out.gif是您的目标文件名)


我刚测试了这两个并且它们都工作正常。但是我从mplayer得到了更好的结果,因为我能够指定分辨率和帧速率。你的milage可能会有所不同,如果你看的话,我相信你可以找到更多的ffmpeg选项。

答案 2 :(得分:33)

使用ImageMagick:

convert *.png a.gif

答案 3 :(得分:11)

ffmpeg .avi .avi .gif 工作,但唯一要注意的事项是你的图像必须以完美的增加数字顺序命名才能工作,没有间隙。我编写了一个快速python脚本来相应地重命名我的所有图像,以便这个 ffmpeg 配方可以工作:

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)

然后我偶然发现了比 ffmpeg 更简单的方法进行转换,这只是使用ImageMagick的命令行转换工具

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

没有比那些人简单得多。

请点击此处:https://gist.github.com/3289840

答案 4 :(得分:3)

根据Simon P Stevens和dwurf的答案,我提出了这个简化的解决方案:

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

这导致每个图像的速率为1秒。根据您的需要调整framerate值。

答案 5 :(得分:2)

我只想添加dwurf的答案,这将生成一个带有标准256色调色板的gif,看起来并不那么令人愉悦。

我找到two blog-posts并根据我的需要调整它们,以便通过为动画使用自定义调色板来提高视觉质量:

生成调色板:

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

将图像转换为具有所需帧速率的常规视频,因为第三个命令仅适用于单个输入视频而不是一堆图像

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

现在将生成的视频转换为更漂亮的gif:

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