使用算法制作动态GIF的最佳方法是什么?

5
我有一个算法可以在各种尺寸的棋盘上(例如100x100)完成骑士巡游,并且我想动画呈现结果。每当骑士移动到新的方格时,(正方形)画布中相应的像素将会改变颜色,直到整个画布都被着色。生成的动画将可在有关该算法的网页上查看。
如果我想要广泛的浏览器支持,动画GIF似乎是最好的方法(但欢迎其他建议)。使用什么工具或库最好呢?我很乐意使用任何在Linux或Mac计算机上免费提供的工具。
实际算法太长了,在此无法提供有用的示例(如果您真的很好奇,请参见这篇论文),但以下是一个(枯燥的)8x8棋盘上国王之旅的伪代码:
movie = new Movie()
frame = new Frame()
frame.fillRectangle((1,1), 8, 8, BLUE)
for row in [1..8] {
    if (row.isOdd()) { colrange = [1..8] } else { colrange = [8..1] }
    for col in colrange {
        frame.colourPixel(row, col, RED)
        movie.addFrame(frame)
    }
}
movie.saveAsGIF("tour.gif")

加分题:我们能否利用这部电影的特殊功能来降低文件大小?维基百科文章表明,如果我们仅更改一些像素 - 实际上我们只更改每帧中的一个像素,那么我们可能可以做到。


不要使用动画GIF。相反,将其转换为电影格式,压缩率会更高。 - 1800 INFORMATION
你建议使用什么格式,以及用什么工具来创建它? - Douglas Squirrel
压缩级别取决于许多因素。对于简单的图像,gif 格式就足够了。此外,大小可能并不像简单性那样重要。动态 gif 并不是非常出色的技术,但它们得到了广泛的支持。 - Naaff
2个回答

6
你可以使用giflib来完成这个任务。文档在下载中提供。
例如,此页面包含使用giflib创建的动画gif以及用于生成动画的程序的源代码。看一下如何使用giflib制作动画可能会有所帮助。 编辑: 如果您不介意进行一些后处理,则另一种选择是使用简单格式(例如PPM)输出帧,然后使用ImageMagick制作动画gif
至于您的额外积分问题:ImageMagick甚至可以为您执行帧比较,以减小输出文件的大小。

1
谢谢。我正在考虑采用您的第二种选择:使用Python图片库绘制一系列.gif图像,然后使用ImageMagick将它们组合成(优化的)动画。 - Douglas Squirrel

0
针对您的额外学分问题,您可以通过仅在新帧上绘制更改部分的图像并将其余部分设置为透明来自行进行此改进。

明白了。看起来ImageMagick会为我执行比较和优化,但如果出现问题,我也可以手动完成。 - Douglas Squirrel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接