从一组 jpeg 图像创建动画 gif

问题描述 投票:0回答:6

我需要一些可以在 Windows 7 上编写脚本的东西。该图像将用于横幅。

windows animated-gif
6个回答
140
投票

Simon P Stevens 的回答几乎让我明白了:

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

让我们看看能否解决这个问题。

无需通过 avi。

-pix_fmt
rgb24
无效,并且
-loop_output
选项可防止循环,这是我不想要的。我们得到:

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

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

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

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

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

我还需要将它们顺时针旋转90度

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

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

ffmpeg -f image2 -framerate 9 -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,crop=299,431,0,100 out.gif

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

Example of an animated gif created with ffmpeg


75
投票

您可以使用 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 ffmpeg 二进制文件


您也可以使用 mplayer 执行类似的操作。请参阅从多个输入图像文件进行编码

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

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 得到了更好的结果,因为我能够指定分辨率和帧速率。您的情况可能会有所不同,我相信如果您查看的话,您可以找到更多 ffmpeg 选项。


61
投票

使用 ImageMagick:

convert *.png a.gif

15
投票

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


14
投票

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

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

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

framerate
值。


12
投票

我只是想补充一下 dwurf 的答案,这将生成一个带有标准 256 色调色板的 gif,这看起来不太美观。

我找到了两篇博客文章,1存档)和2死链接(仅存在存档版本),并根据我的需要进行了调整,以改善视觉效果通过为您的动画使用自定义调色板来提高质量:

生成调色板:

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

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

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

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

ffmpeg -i video.flv -i palette.png -filter_complex "fps=1.2,scale=900:-1:flags=lanczos[x];[x][1:v]paletteuse" video.gif
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.