将数千个.png转换为动画.gif,`convert`使用太多内存

许多询问 如何 从一组 png图像 创建 动画gif的问题建议使用ImageMagick的convert命令的变体:

 convert -delay 2 -loop 0 *.png animated.gif 

但是,我有几千个图像 ,因此convert用尽我的所有内存,交换,然后崩溃。 存在哪种替代软件,更具记忆意识? 如果不支持.gif我可以使用另一种开放格式,我更喜欢CLI工具。

听起来你正在尝试制作video。 如果是这种情况,那么我会使用正确的video格式。

在这种情况下,我会使用ffmpeg将各个PNG文件转换为H.264video。 由于ffmpeg可以使用长达数小时的video,因此您的数千张图片应该没有任何问题。 使用H.264代替动画gif将大大提高图像质量。

这样的事情对你有用:

  ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4 
  • -framerate 1/2 :这将帧速率设置为FPS的一半,或每帧2秒。
  • -i img%04d.png :这告诉ffmpeg通过img9999.png读取文件img9999.png
  • -c:v libx264 :使用video编解码器libx264。
    • 如果您愿意,可以在此处指定video压缩参数:
    • -crf :质量设置。 0到51. 23是默认值。 0是真正的无损编码,这将是相当高的带宽。 18几乎是视觉无损的。
  • -r 30 :将输出帧速率设置为30 FPS。 将复制每个输入图像以使输出在此处指定。 您可以关闭此参数,输出文件将处于输入帧速率,但刚刚尝试时生成的影片无法正常显示。
  • out.mp4 :输出文件名。

参考文献:

  • 从图像创建video幻灯片
  • FFmpeg和H.264编码指南

就个人而言,我只会在有限数量的文件上启动它,而不是一次性启动它。 例如,像这样:

 #!/usr/bin/env bash ## Collect all png files in the files array files=( *png ) ## How many should be done at once batch=50 ## Read the array in batches of $batch for (( i=0; $i<${#files[@]}; i+=$batch )) do ## Convert this batch convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif done ## Now, merge them into a single file convert animated.*.gif all.gif 

使用-limit memory 1GiB来限制convert使用的内存量。

1000个图像将创建一个巨大的GIF,大多数计算机将难以显示。 我尽可能将动画GIF设置在200张以下。 越少越好。 如果为图像编号,此命令将删除奇数编号的图像rm *[13579].png

这是我从电影场景创建动画GIF的典型工作流程:

 avconv -ss 00:26:00 -i someMovie.mpg %5d.png rm *[13579].png convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif 

如果你有数千个png-s,anigif格式很奇怪。 我会这样做,使用avconv

  avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov 

如果不支持.gif我可以使用另一种开放格式

也许APNG对你有用。 它受到一些浏览器的支持,包括Firefox,但目前不包括Chrome和IE。 由于它只是一个PNG扩展,因此将PNG转换为APNG 非常简单。 apngasm工具可以做到这一点。 但格式非常简单,我最近自己为Sage编写了一个APNG汇编程序。 适应该代码将是一种替代方案。

gifsicle是一个用于处理GIF动画的命令行实用程序。 如果您愿意为内存换取速度,可以使用–conserve-memory开关。

除了其他答案:由于您想要生成GIF文件,我假设您要在网页上显示图像。 如果是这样,我根本不打算转换你的PNG。 只需谷歌“javascript幻灯片”,并使用数百万免费脚本之一。 或者写自己的,这真是微不足道。

这样做的好处是:

  • 浏览器中任何时候只能加载一个图像,幻灯片启动速度很快,用户机器上不会消耗太多RAM。

  • 该解决方案可扩展到数百万张图像。 或者数十亿,如果你有足够的耐心观看它们:)

  • 您可以向页面添加控件以暂停,后退,更改延迟或转到特定帧。