从PNG文件创建GIF动画


83

是否有工具可以gif从一组png文件创建动画?

我尝试了ImageMagick套件中的convert命令,但这并不总是成功。另外,我对此有几个问题:

  1. 我不知道进展如何。
  2. 不管我尝试什么,该-delay标志都不会更改gif动画的帧频。
  3. convert根据文件名的字母顺序确定帧顺序。这意味着name500.png它将被放置在之后,name50.png而不是在name450.png我可以通过添加0来解决此问题之后,而不是之后放置,但这很烦人。

[新闻] Ubuntu Stackexchange和Unix Stackexchange之间存在大量重叠。我试图在这里对一些线程进行分类。
hhh 2012年

关于项目3,convert对文件排序后仍可以使用。可能类似的东西起作用了files=$(ls name*png | sort -n -tname -k1); convert $files animation.gif
altroware'Jun 11''17

对于点1:convert具有-monitor跟踪过程的参数
Curlew

Answers:


50

较新版本的ffmpeg没有-sameq(请参阅faq),但具有GIF支持。

ffmpeg -i %03d.png output.gif

其中%03d是3位数字的帧ID。

您也可以尝试使用ffmpeg一系列图像来创建影片,然后将影片转换为GIF动画(再次使用ffmpeg)。

# cf. http://pages.uoregon.edu/noeckel/MakeMovie.html

# first convert an image sequence to a movie
ffmpeg -sameq -i %03d.jpg output.mp4

# ... and then convert the movie to a GIF animation
ffmpeg -i output.mp4 -pix_fmt rgb24 -s qcif -loop_output 0 output.gif

10
该指令已过期。
highmaintenance

3
sameq选项不再可用。此外,对我来说,这将覆盖原始图像文件,并且不会产生有效的电影文件。
罗德2014年

-sameq代码保留在那里的意义何在?您为什么还要output.mp4临时使用有损视频格式()?如果是这样,为什么要以“相同质量”作为输入,而不是很高的比特率?由此产生的假象只会使GIF编码器的情况变得更糟。如果确实需要将视频用作临时视频,则可以使用无损的视频,例如huffyuv。或没有转码的MJPEG,只需将输入的jpeg重新混合为MJPEG。(-codec:video copy)。
彼得·科德斯

80

convert是一个方便的命令行工具。 cd到包含png -files 的文件夹,然后运行以下命令:

convert -delay 10 -loop 0 *.png animation.gif

来源:http//ubuntuforums.org/showthread.php?t = 1132058


5
该问题提到convert了使用它的一些问题。您的答案没有解决任何一个。

3
从ImageMagick版本开始,6.8.7-4 2013-11-02 Q16这对我有用。
鲁迪·马泰拉

7
这有效,但是10意味着10 * 10ms,非常快。延迟a 100为1秒。
Anne van Rossum 2015年

7
使用选项-dispose previous或者-dispose 2如果您正在使用透明的PNG工作
海防

4
给我自己说明:大括号扩展有助于将图像列表指定为参数,例如pic_{0..20..2}.png扩展至pic_0.pngpic_2.png一直扩展到pic_20.png
Yibo Yang,

19

convert--delay选项仅适用于在命令行下一个图像。因此,convert -delay 10 *仅将第一帧的延迟设置为0.1秒。该选项需要重复:

convert $(for a in *; do printf -- "-delay 10 %s " $a; done; ) result.gif

对于您的排序需求,convert不会对框架进行排序,shell globing *会对框架进行排序。如果您知道帧的编号是从0到700,则可以自己计算数字:

convert $(for ((a=0; a<700; a++)); do printf -- "-delay 10 name%s.png " $a; done;) result.gif

5
我没有遇到这种行为convert,因为我convert -delay 1000 -loop 0 *.png animation.gif确实在每个图像之间增加了10s的延迟。
罗德2014年

1
您还可以使用版本排序的的ls命令。那是:convert -delay 1000 $(ls -v name*png) output.gif
erik

7

更新:

使用convert的PNG到GIF,然后使用gifsicle的动画。当然,这不是一个一劳永逸的解决方案,而是可以编写脚本的。


GIMP可以创建动画gif,并提供定时/延迟和重复等控制功能


3
我了解gimp,但是不知道如何编写脚本。此外,使用gimp制作动画就像用大炮杀死苍蝇
Yotam

1
那是个坏主意;由于每个帧都会被单独量化,因此质量会很糟糕。
克莱门特

2

ImageMagick可以生成高质量的gif动画。观看此视频-http: //www.youtube.com/watch?v= OFusYizJ- bA


6
欢迎使用Unix和Linux!通常,我们希望网站上的答案能够独立存在-链接很棒,但是,如果该链接中断,则答案应该具有足够的信息,仍然对您有所帮助。请考虑编辑您的答案以包括更多详细信息。有关更多信息,请参见FAQ
slm

上面的评论真有用
路加福音

convert -delay 200 -loop 0 *.jpg output.gif
路加福音

2

ffmeg重要的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
ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i 'tmp.*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

测试数据是通过以下方式生成的:https : //stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

ffmpeg我想强调的重要选项是:

  • -patter_type glob:选择图像的便捷方法
  • -framerate 60并且-r 15:假设输入图像为60 FPS(ffmpeg由于视频中没有像视频格式一样FPS数据,所以不知道其他原因),请每4张图像选择一个,因此减小尺寸(4 == 60 / 15
  • -vf scale=512:-1:按比例设置宽度,比例尺高度,通常是为了减小尺寸并节省空间

也可以看看:

已在Ubuntu 18.10,ffmpeg 4.0.2中测试。


-1

关于第2点

我拥有的ImageMagick“显示”版本(ImageMagick 6.7.2-7 2017-01-12)忽略了使用convert命令设置的帧频来生成动画gif。尝试另一个程序来查看动画gif,例如firefox。

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.