许多询问 如何 从一组png图像中创建动画gif 的问题建议使用ImageMagick 命令的变体: convert
convert -delay 2 -loop 0 *.png animated.gif
但是,我有几千张图像,因此convert
用尽了所有内存,交换,然后崩溃了。存在哪些替代软件,它们更注重内存?如果.gif
不支持,我可以使用其他开放格式,并且我确实更喜欢CLI工具。
许多询问 如何 从一组png图像中创建动画gif 的问题建议使用ImageMagick 命令的变体: convert
convert -delay 2 -loop 0 *.png animated.gif
但是,我有几千张图像,因此convert
用尽了所有内存,交换,然后崩溃了。存在哪些替代软件,它们更注重内存?如果.gif
不支持,我可以使用其他开放格式,并且我确实更喜欢CLI工具。
Answers:
听起来您正在尝试制作视频。如果是这样,那么我会使用适当的视频格式。
在这种情况下,我将使用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.png
:告诉FFmpeg读取这些文件img0000.png
虽然img9999.png
。-c:v libx264
:使用视频编解码器libx264。
-crf <number>
:质量设置。0到51。默认值为23。0是真正的无损编码,这将是相当高的带宽。18在视觉上几乎无损。-r 30
:将输出帧频设置为30 FPS。每个输入图像将被复制,以使输出达到您在此处指定的效果。您可以将此参数保留为关闭状态,并且输出文件将采用输入帧速率,但是当我刚才尝试生成的电影时,该电影无法正确显示。out.mp4
:输出文件名。参考文献:
就个人而言,我只会在有限数量的文件上启动它,而不是一次启动。例如,如下所示:
#!/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
使用。
数千张图像将创建一个巨大的GIF,大多数计算机将难以显示该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
如果
.gif
不支持,我可以使用其他开放格式
也许APNG对您有用。某些浏览器(包括Firefox)支持该功能,但目前不包括Chrome和IE。由于它只是PNG扩展名,因此将PNG转换为APNG 非常简单。该apngasm工具可以做到这一点。但是格式是如此简单,以至于我最近为Sage编写了一个APNG汇编程序。修改该代码将是替代方法。
gifsicle是用于处理GIF动画的命令行实用程序。如果您愿意以内存换取速度,则可以使用其--conserve-memory开关。
除了其他答案:由于您要生成GIF文件,因此我假设您要在网页上显示图像。如果是这样,我根本不会理会您的PNG转换。只需在Google上搜索“ javascript幻灯片”,即可使用数百万个免费脚本之一。或自己写,这确实很简单。
这样做的好处是:
随时仅在浏览器中加载一张图像,幻灯片播放开始很快,并且不会占用用户计算机上的大量RAM。
该解决方案可扩展到数百万张图像。或数十亿,如果您有足够的耐心观看所有节目:)
您可以在页面上添加控件以暂停,快退,更改延迟或转到特定的帧。
convert -delay 2 -loop 0 0*.png animated.gif
仅转换以“ 0”开头的文件。等等。