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


78

.gif要从给定的.jpg图片集中制作动画图片。

我希望从命令行执行此操作,因此非常欢迎使用命令行工具。


Answers:


87

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

sudo apt-get install imagemagick

现在,您可以使用以下gif图片创建一个图片jpg

convert -delay 20 -loop 0 *.jpg myimage.gif

6
请在此处包括如何将gif动画等尺寸调整50%。等等-resize 50%
莱奥波尔德·赫兹(LéoLéopoldHertz),2016年


ImageMagick用户可能还需要:-deconstruct。我还发现ImageMagick非常渴望存储,请参见基准:askubuntu.com/a/1102183/52975
Ciro Santilli新疆改造中心法轮功六四事件

convert -delay 0 -loop 0 *.tif myanimated.gif在720个tif文件上效果很好
RON

46

要完成@Maythux答案:

为了避免生成非常大的文件,可以使用-resizeoption:

就我而言,我有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 / s),所以它们的修改时间都相同,因此您不能使用ls -t例如技巧。在ubuntu上,您可以使用ls -v类似以下内容的代码:

convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif

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


4
您可以通过将填充数设为零来避免* .jpg问题。以“ 01.jpg”代替“ 1.jpg”,依此类推。如果你到三位数,然后“001.JPG”,“010.jpg”,等等
bigreddmachine

2
解决文件名序列问题有几种方法。包括find,,花sort括号扩展等。ls众所周知,该工具不适合这种事情。使用find。有一些学习曲线,但这是值得的。
声音

一些用户可能对使用massren编辑文件名感兴趣:github.com/laurent22/massren
Graham P Heath

这需要很长时间才能完成。有详细的选择吗?
ouranos

21

我没有足够的名声来评论,但是您可以使用globbing来使您的shell扩展文件名,而不是修改文件名

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif

11

GIMP

您可以使用GIMP轻松地做到这一点。如果尚未安装,请先安装

sudo apt-get install gimp

创建gif

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

打开为图层

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

将文件类型设置为GIF

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

GIF导出选项


7

ffmeg解决方案+测试数据

从Ubuntu 18.10,ffpmeg 4.0.2-2,ImageMagick 6.9.10-8开始,我发现ffmpeg更快,并且使用的内存更少

最简单的转换命令是:

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正常工作,我首先必须按照以下说明修改其磁盘和内存限制/etc/ImageMagick-6/policy.xmlhttps : //superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

也可以看看:

ImageMagick vs ffmpeg基准

我比较了命令:

/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默认情况下会计算这些差异,但除非-deconstruct使用ImageMagick,否则不会计算。

    基本上,您每次都希望通过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秒

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


支持并喜欢!,很好的回答,我有一个小问题。我没有那么多高质量的图像,也没有使用-r -v命令,但输出gif的质量比原始png文件低得多。如何保持给定png文件的gif质量?
astro123

嗨@ astro123质量如何降低?较小的图像大小,较少的帧或其他(GIF显然使用无损,因此压缩不会更糟)吗?尝试-framerate 60 -r 60。检查生成的GIF并使用ImageMagick工具输入图像,例如identify尝试找出正在发生的情况。
Ciro Santilli新疆改造中心法轮功六四事件

4

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

sudo apt-get install imagemagick

现在创建.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

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


1
如何在循环的GIF中制作40张PNG图像?所有在文件夹/ home / fusion809 / Documents / Images
BH2017

1
@ BH2017:convert -delay 20 -loop 0 *.png out.gif循环播放GIF。
unutbu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.