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

May*_*hux 132 command-line image-processing gif

我想.gif从一组给定的.jpg图片中制作动画图片。

我更喜欢从命令行执行此操作,因此非常欢迎命令行工具。

May*_*hux 144

您可以使用ImageMagick包。使用以下命令安装它:

sudo apt-get install imagemagick
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用以下方法gif从图片数量( jpg)创建一个:

convert -delay 20 -loop 0 *.jpg myimage.gif
Run Code Online (Sandbox Code Playgroud)

  • 请在此处包括您如何将 gif 动画等大小调整 50%。等等`-resize 50%`。 (10认同)
  • Ubuntu 18.10 因这些图像的“缓存资源耗尽”而失败:https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true 相关:https://superuser.com/问题/1178666/imagemagick-convert-quits-after-some-pages (2认同)

Nin*_*suo 64

要完成@Maythux 回答:

为避免生成非常大的文件,您可以使用-resize选项:

就我而言,我有 4608x3456 张图片,32 张图片生成的 gif 超过 300M

convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif
Run Code Online (Sandbox Code Playgroud)

或者

convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif
Run Code Online (Sandbox Code Playgroud)

照顾*.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
...
Run Code Online (Sandbox Code Playgroud)

由于拍摄速度非常快(10/s),因此它们都有相同的修改时间,ls -t例如您无法欺骗使用。在 ubuntu 上,您可以ls -v改为使用,例如:

convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif
Run Code Online (Sandbox Code Playgroud)

不过,在 Mac OS X 上按数字排序非常棘手,我想您需要构建一个自定义脚本。

  • 您可以通过用零向前填充数字来避免 *.jpg 问题。“01.jpg”而不是“1.jpg”,依此类推。如果你达到三位数,那么“001.jpg”、“010.jpg”等等。 (8认同)
  • 有几种方法可以解决文件名序列问题。包括`find`、`sort`、大括号扩展等。众所周知,ls 工具不适合这种事情。使用“查找”。有一点学习曲线,但这是值得的。 (2认同)

Cir*_*郝海东 28

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

您可以通过以下方式获取我的测试数据:

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

测试数据是通过以下方式生成的:https : //stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292,包含 256 张 1024x1024 PNG 图像。

这是您现在可以直接在浏览器中生成的另一个测试数据!/sf/ask/1346470051/#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 \
;
Run Code Online (Sandbox Code Playgroud)

这些命令被构造为产生尽可能接近的输出,以使比较有效:

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

    对于压缩版本,所有帧的大小都比初始帧小,例如:

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

    在这个例子中,第二帧只是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
Run Code Online (Sandbox Code Playgroud)

对于 ffmpeg:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172
Run Code Online (Sandbox Code Playgroud)

从中我们看到:

  • ImageMagick 使用了 2.6Gb 的 RAM,耗时约 1 分钟
  • ffmpeg 使用了 100Mb 的 RAM,耗时 4 秒

测试硬件:联想 ThinkPad P51 笔记本电脑,英特尔酷睿 i7-7820HQ,32GB(16+16) DDR4 2400MHz SODIMM,512GB SSD PCIe TLC OPAL2。

  • 投票并喜欢!,很好的答案,我有一个小后续问题。我没有那么多高质量的图像,并且我没有使用“-r”和“-v”命令,但输出的 gif 的质量仍然比原始 png 文件低得多。如何保持 gif 与给定 png 文件相同的质量? (2认同)

小智 26

您可以使用通配符让 shell 扩展文件名,而不是修改文件名

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif
Run Code Online (Sandbox Code Playgroud)


che*_*edo 17

GIMP

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

sudo apt-get install gimp
Run Code Online (Sandbox Code Playgroud)

创建 gif

从 GIMP 转到File -> Open as Layers以打开它们自己层上的所有 png。

作为图层打开

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

将文件类型设置为 GIF

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

GIF 导出选项

更改帧之间的延迟

修改层的名称,并在括号之间包含以毫秒为单位的延迟,如下所示: (1500ms)

在此处输入图片说明

导出前预览动画

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


Sco*_*ame 5

您可以使用 imagemagick 包中包含的名为 convert 的程序。它是命令行驱动的,但非常易于使用。通过软件中心安装它,或转到命令提示符并键入

sudo apt-get install imagemagick
Run Code Online (Sandbox Code Playgroud)

现在创建.gif。

convert -delay 100  -size 100x100 xc:SkyBlue \
          -page +5+10  balloon.gif   -page +35+30 medical.gif  \
          -page +62+50 present.gif   -page +10+55 shading.gif  \
          -loop 0  animation.gif
Run Code Online (Sandbox Code Playgroud)

*请注意,上面的示例直接来自Image Magick 示例

  • @BH2017:`convert -delay 20 -loop 0 *.png out.gif` 制作循环 GIF。 (3认同)

归档时间:

查看次数:

146011 次

最近记录:

4 年,1 月 前