我需要可以在 Windows 7 上编写脚本的东西。此图像将用于横幅中。
6 回答
西蒙 P 史蒂文斯的回答几乎让我到了那里:
ffmpeg -f image2 -i image%d.jpg video.avi
ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif
让我们看看我们是否可以整理一下。
不需要通过avi。A -pix_fmt
ofrgb24
无效,并且该-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
您可以在此处获取 ffmpeg 的 Windows 二进制文件。
你也可以用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
没有比这更简单的人了。
我只是想补充一下dwurf的答案,这将生成一个带有标准 256 色调色板的 gif,这在视觉上看起来并不令人愉悦。
我找到了两篇 博客文章并根据我的需要对其进行了调整,以便通过为动画使用自定义调色板来提高视觉质量:
生成调色板:
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
根据 Simon P Stevens 和 dwurf 的回答,我想出了这个简化的解决方案:
ffmpeg -f image2 -framerate 1 -i image%d.jpg video.gif
这导致每张图像的速率为 1 秒。framerate
根据您的需要调整值。