我想.gif
根据给定的一组.jpg
图片制作一幅动画图片。
我更喜欢通过命令行来执行此操作,因此命令行工具会非常受欢迎。
答案1
您可以使用图像魔术师软件包。使用以下命令安装:
sudo apt-get install imagemagick
现在你可以使用以下方式创建一个gif
来自图片数量的文件(jpg
):
convert -delay 20 -loop 0 *.jpg myimage.gif
答案2
完成@Maythux 的回答:
为了避免生成非常大的文件,您可以使用-resize
选项:
在我的例子中,我有 4608x3456 的图像,并且 32 幅图像生成的 gif 超过 300M
convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif
或者
convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif
照顾*.jpg
*.jpg
处理数值时有点糟糕,您可能会生成带有未分类图片的 gif。
$ ls|cat
21-33-26_1.jpg
21-33-26_10.jpg // <--- this one
21-33-26_2.jpg
21-33-26_3.jpg
21-33-26_4.jpg
21-33-26_5.jpg
21-33-26_6.jpg
21-33-26_7.jpg
21-33-26_8.jpg
21-33-26_9.jpg
21-33-28_1.jpg // <--- should be here
21-33-28_2.jpg
21-33-28_3.jpg
...
由于拍摄速度非常快(10/秒),所以它们的修改时间都相同,您无法使用ls -t
例如来欺骗。在 ubuntu 上,您可以改用ls -v
以下方法:
convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif
不过,在 Mac OS X 上按数字排序相当棘手,我想您需要构建一个自定义脚本。
答案3
ffmeg解决方案+测试数据
从 Ubuntu 18.10、ffpmeg 4.0.2-2、ImageMagick 6.9.10-8 开始,我发现 ffmpeg 比 ImageMagick 快得多,并且使用更少的内存。
最简单的转换命令是:
ffmpeg \
-framerate 60 \
-pattern_type glob \
-i '*.png' \
-r 15 \
-vf scale=512:-1 \
out.gif \
;
您可以使用以下方式获取我的测试数据:
wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
测试数据由以下项生成:https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292并包含256张1024x1024 PNG 图像。
这是您现在可以直接在浏览器中生成的另一个测试数据!https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718
ffmpeg
我想要强调的重要选项是:
-pattern_type glob
:选择图像的便捷方式-framerate 60
:假设输入图像为 60 FPS,并输出相同的 FPS。ffmpeg
否则就无法知道,因为图像中没有像视频格式那样的 FPS 数据。256 个输入帧大约需要 4 秒才能完成。
-r 15
:可选。每 4 张图片挑选一张,以减小尺寸 (4 == 60 / 15
)。有了它,
identify out.gif
就表示 GIF 仅包含 64 帧。播放仍需要 4 秒,因此改变延迟以使其匹配。
-vf scale=512:-1
:可选。设置宽度,按比例缩放高度,通常是为了减小尺寸并节省空间。
也可以看看:
- 来自图片的视频:https://stackoverflow.com/questions/24961127/how-to-create-a-video-from-images-with-ffmpeg/37478183#37478183
- 视频中的 GIF:如何通过命令行从 MP4 视频创建动画 GIF?
ImageMagick 与 ffmpeg 基准测试
为了使 ImageMagick 正常工作,我首先必须修改其磁盘和内存限制,/etc/ImageMagick-6/policy.xml
如下所述:https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages
我比较了这些命令:
/usr/bin/time -v convert *.png -deconstruct -delay 1.6 out-convert.gif
/usr/bin/time -v ffmpeg \
-framerate 60 \
-pattern_type glob \
-i '*.png' \
out-ffmpeg.gif \
;
这些命令的构造是为了产生尽可能接近的输出,以使比较有效:
/usr/bin/time -v
:用于查找最大内存使用量,如下所述:https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process-deconstruct
:GIF 图像可以仅包含前一帧的最小修改矩形,以使 GIF 更小。ffmpeg
默认情况下计算这些差异,但是 ImageMagick 不会,除非-deconstruct
使用。基本上,您每次使用 ImageMagick 时都会希望使用该选项。
我们可以通过以下方式观察差异:
identify out.gif
对于压缩版本,所有帧的尺寸都比初始帧小,例如:
out.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010 out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010 out.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
在这个例子中,第二帧不是
516x516
完整的 1024x1024,而是放置在偏移量处252+257
。因此它只包含中间的三角形。-delay
:与 60FPS 相匹配的值ffmpeg
。对于转换性能来说应该无关紧要,但我不想冒这个险。
输出的 GIF 大小大致相同且看起来完全相同。
我们得到 ImageMagick 的:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856
对于 ffmpeg:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172
由此我们可以看出:
- ImageMagick 使用了 2.6Gb 的 RAM,耗时约 1 分钟
- ffmpeg 使用了 100Mb 的 RAM,耗时 4 秒
测试硬件:联想ThinkPadP51 笔记本电脑、英特尔酷睿 i7-7820HQ、32GB(16+16)DDR4 2400MHz SODIMM、512GB SSD PCIe TLC OPAL2。