将数千个 .png 转换为动画 .gif,“convert”占用过多内存

将数千个 .png 转换为动画 .gif,“convert”占用过多内存

许多提问 如何创建 动画 gif 来自一组 png 图像建议使用 ImageMagickconvert命令的变体:

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

然而,我已经几千张图片从而convert耗尽了我所有的内存和交换,然后崩溃。有哪些替代软件更注重内存?如果不支持,我可以使用另一种开放格式.gif,但我确实更喜欢 CLI 工具。

答案1

听起来你正在尝试制作视频。如果是这样的话,那么我会使用适当的视频格式。

在这种情况下,我会使用ffmpeg将单个 PNG 文件转换为 H.264 视频。由于 ffmpeg 可以处理长达数小时的视频,因此处理数千张图像应该没有问题。使用 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.pngimg0000.png:这告诉 ffmpeg读取文件img9999.png
  • -c:v libx264:使用视频编解码器libx264。
    • 如果您愿意,可以在这里指定视频压缩参数:
    • -crf <number>:质量设置。0 到 51。23 为默认值。0 为真正的无损编码,这将需要相当高的带宽。18 几乎是视觉上无损的。
  • -r 30:将输出帧速率设置为 30 FPS。每个输入图像将被复制,以使输出达到您在此处指定的值。您可以关闭此参数,输出文件将处于输入帧速率,但刚才我尝试时,生成的影片无法正确显示。
  • out.mp4:输出文件名。

参考:

答案2

就我个人而言,我只会针对有限数量的文件启动它,而不是一次性启动所有文件。例如,如下所示:

#!/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

答案3

用于-limit memory 1GiB限制内存使用量convert

数千张图像会创建一个巨大的 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

答案4

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

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

相关内容