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

dot*_*hen 34 command-line convert software-recommendation image-processing

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

convert -delay 2 -loop 0 *.png animated.gif
Run Code Online (Sandbox Code Playgroud)

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

小智 35

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

在这种情况下,我会使用ffmpeg将单个 PNG 文件转换为 H.264 视频。由于 ffmpeg 用于处理可能长达数小时的视频,因此您的数千张图像应该没有问题。采用H.264,而不是gif动画将导致一个庞大的图像质量的改进。

这样的事情应该适合你:

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

参考:


ter*_*don 14

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

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


PLA*_*PLA 9

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

  • 谢谢,该解决方案效果很好。可能还需要增加 /etc/ImageMagick-6/policy.xml 中允许的内存限制,请参阅 https://github.com/ImageMagick/ImageMagick/issues/396#issuecomment-464070038 了解更多信息 (2认同)

Fra*_*que 4

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

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov
Run Code Online (Sandbox Code Playgroud)