如何将PNG图片序列转换为GIF?

所以,我在一个程序中制作了这个动画,但是它似乎不支持将其导出为PNG序列,以便我可以转换成GIF。这个动画有100多帧,所以逐一保存每个图像将会花费很长时间。然而,它支持将其导出为“条带”,就像电影胶片一样。动画中的每张图片都具有相同的尺寸。下面是该程序的“条带”功能的工作原理。
动画中的图像水平堆叠,第一帧位于最左边,最后一帧位于最右边。帧之间没有间隙,文件名通常为“name_stripX.png”,其中X表示动画的帧数。如果每帧大小为32x32,并且动画有8帧,则该文件的宽度为256,高度为32。
以下是一些示例输出,每种颜色填充一帧:

Example Output

另外,为了更加明确一些事情,这个程序叫做“Game Maker 8.0”。
1个回答

你可以使用ImageMagick以各种方式转换图像,而且这应该相当容易。首先,你可以将其分成两部分(original.png是源图像,在此情况下为32x32像素大小):
convert original.png -crop 32x32 parts-%02d.png

你可以将其转换为动画(如果不想循环播放,请使用-loop 1)。
convert -loop 0 -page +0+0 ./parts*.png output.gif

导致:

第一条命令的输出PNG文件中包含了一个偏移量,所以如果没有使用-page +0+0选项,动画最终会变成这样:

有其他不同的选项可以包括(主要是在第二个命令中),比如-delay等等 - 你还可以优化动画使其更小(加载/渲染速度更快)- 例如从这里借鉴的:

convert output.gif -fuzz 10% -layers Optimize optimised.gif

或者使用gifsicle
gifsicle -O output.gif -o optimised.gif
编辑:如果帧是透明的,您可以通过添加-dispose Background选项来设置帧的替换,这样当加载下一帧时,前一帧就会被丢弃:


上面的示例没有使用page选项,所以显示得很清楚

但这样做的问题是,您可能无法对生成的图像进行优化,因此另一种方法可能是使帧不透明,这样下一帧就会覆盖前一帧。


图片具有透明度,基本上只是在前一帧的基础上绘制下一帧,有没有办法让它在空白处绘制下一帧呢? - user245115
从源图像中去除透明度是最简单的方法。但也可以通过更多参数来完成。 - david6
@user245115 - 在编辑中,将框架替换而不是叠加。请参考修改。 - Wilf