从一组jpeg图像创建动画gif

Cbo*_*box 33 windows animated-gif

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

dwu*_*urf 73

Simon P Stevens的回答几乎让我在那里:

ffmpeg -f image2 -i image%d.jpg video.avi
ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif
Run Code Online (Sandbox Code Playgroud)

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

通过avi进行是不必要的.一-pix_fmtrgb24是无效的,而-loop_output选项防止循环,这是我不想要的.我们得到:

ffmpeg -f image2 -i image%d.jpg out.gif
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -f image2 -i image_%003d.jpg out.gif
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299 out.gif
Run Code Online (Sandbox Code Playgroud)

我还需要顺时针旋转90度

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif
Run Code Online (Sandbox Code Playgroud)

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

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

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

使用ffmpeg创建的动画gif的示例

  • 感谢您的详细解答和逐步说明. (6认同)
  • 如果您的图像索引不是从零开始,请使用“-start_number xxx”选项。https://superuser.com/a/666994/999889 (3认同)
  • image2代表什么? (3认同)
  • `image2` 是 ffmpeg 解复用器的名称(读取输入的位)。“image2”提供“-i”中使用的文件通配符,并知道如何将文件读取为视频源。请参阅http://manpages.org/ffmpeg (2认同)

Sim*_*ens 49

你可以用ffmpeg做到这一点

首先将图像转换为视频:

ffmpeg -f image2 -i image%d.jpg video.avi
Run Code Online (Sandbox Code Playgroud)

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

然后将avi转换为gif:

ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif
Run Code Online (Sandbox Code Playgroud)

你可以在这里获得ffmpeg的windows二进制文件.


你也可以用mplayer做类似的事情.请参阅从多个输入图像文件进行编码.

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

mplayer mf://*.jpg -mf w=800:h=600:type=jpg -vf scale=160:120 -vo gif89a:fps=3:output=out.gif
Run Code Online (Sandbox Code Playgroud)

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


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

  • 这有一个很好的谷歌搜索评级,所以如果你想用零作为数字前缀,请使用“%04d”(数字 4 将使用 4 个以 0 为前缀的数字位置) (2认同)
  • 精采的答案,所以现在任何尝试使用它的人都知道从.avi到.gif转换的新标志是`-loop`,无限循环选项为0。我也认为rgb配置文件标志(不是我对颜色配置文件一无所知,因此我的缩略图上有一个蓝点的网格 (2认同)
  • 由于 avi 使用有损压缩,转换为 avi 不会降低质量吗? (2认同)

psy*_*brm 37

使用ImageMagick:

convert *.png a.gif
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`-delay`来设置每个图像的显示持续时间.注意,该值以1/100秒给出,即" - 延迟100"导致每秒一帧的速率. (3认同)

Loi*_*erg 12

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)
Run Code Online (Sandbox Code Playgroud)

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

convert image%03d.jpg[0-198] animated_gif.gif
Run Code Online (Sandbox Code Playgroud)

没有比那些人简单得多.

请点击这里:https://gist.github.com/3289840

  • _"图像必须以完美递增的数字顺序命名"_ - 我猜你不知道`-pattern_type glob`,它允许使用任何名称作为输入的文件,例如,将当前目录中的所有png转换为gif :`ffmpeg -framerate 1/10 -pattern_type glob -i'*.png'output.gif` (4认同)

lua*_*tor 6

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

ffmpeg -f image2 -framerate 1 -i image%d.jpg video.gif
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*cha 5

我只是想添加到dwurf的答案中,这将生成带有标准256色调色板的gif,看起来在视觉上并不令人满意。

我发现了两个 博客文章,并根据我的需求进行了调整,以通过为动画使用自定义调色板来改善视觉质量:

生成调色板:

ffmpeg -f image2 -i image%d.jpg -vf scale=900:-1:sws_dither=ed,palettegen palette.png
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg.exe -f image2 -framerate 1.2 -i image%d.jpg video.flv
Run Code Online (Sandbox Code Playgroud)

现在将生成的视频与生成的调色板转换为更漂亮的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
Run Code Online (Sandbox Code Playgroud)