如何从静止图像创建动画 gif(最好使用命令行)?

如何从静止图像创建动画 gif(最好使用命令行)?

我想.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:可选。设置宽度,按比例缩放高度,通常是为了减小尺寸并节省空间。

也可以看看:

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。因此它只包含中间的三角形。

    也可以看看:如何使用 ImageMagick 调整动画 GIF 文件的大小?

  • -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。

答案4

GIMP

你可以使用 GIMP 轻松完成此操作。如果尚未安装,请先安装

sudo apt-get install gimp

创建 gif

从 GIMP 转到文件->作为图层打开在各自的图层上打开所有 png。

作为图层打开

从这里,您可以对图层进行编辑,完成后,转到文件->导出为。在对话框中确保将文件类型设置为 GIF。

将文件类型设置为 GIF

从那里您将进入 GIF 导出选项。勾选“作为动画'选项并根据需要设置参数。

GIF 导出选项

更改帧之间的延迟

修改图层的名称,并在括号中包含毫秒级别的延迟,如下所示:(1500ms)

在此处输入图片描述

导出前预览动画

单击“过滤器”菜单,然后单击“动画”,然后单击“动画播放”。

相关内容