我需要一些可以在 Windows 7 上编写脚本的东西。该图像将用于横幅。
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
最终结果 - 我可以与世界分享我伴侣的精彩面部表情:
您可以使用 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 选项。
使用 ImageMagick:
convert *.png a.gif
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
没有比那些人更简单的了。
根据 Simon P Stevens 和 dwurf 的回答,我想出了这个简化的解决方案:
ffmpeg -f image2 -framerate 1 -i image%d.jpg video.gif
这导致每张图像的速率为 1 秒。 根据您的需要调整
framerate
值。
我只是想补充一下 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