APNG 查看器





5.00/5 (12投票s)
解析并将 APNG 帧提取到每个 PNG 文件
引言
APNG 代表动画 PNG,类似于 gif89,但 gif89 只有 256 种颜色,因此在某些情况下,APNG 可能是更好的选择。 该 APNG 查看器基于优秀的 .NET MNG 查看器,由 SprinterDave 编写,所有功劳归他。 它使用纯 C#,没有任何第三方组件,并且占用空间很小(只有 30K)。
背景
我一直在寻找原生 .NET APNG 解析器/查看器,但不幸的是,正如我在编写 DBX 解析器 时遇到的情况一样,我就是找不到(谷歌到底怎么了,呃?),所以我不得不自己动手。
文件格式
为了了解什么是 APNG,您可能需要阅读一些文章。
APNG 只是 PNG 的一个小的扩展,并且与 PNG 兼容,因此像 Internet Explorer 和其他不支持 APNG 的查看器仍然会显示第一帧。 在这里我们可以看到一个图表,它可以让我们对 APNG 文件格式有一个简要的了解。

示例文件
- http://people.mozilla.com/~dolske/apng/demo.html
- http://animatedpng.com/index.php/category/samples/
- http://treebuilder.de/default.asp?file=89031.xml
- http://www.spreadfirefox.com/node/1872
- http://img244.imageshack.us/img244/3549/slideplayfe9.png
- http://i96.photobucket.com/albums/l197/DonJohnDoe/xtra/animated.png
- http://my.opera.com/Holger%20Will/blog/index.dml/tag/apng
其他语言
也许您正在寻找其他语言的版本。 如下所示:
工作原理
它像 .NET MNG 查看器 一样逐块读取,根据基本标头重建每个 PNG 帧。 如果您仔细查看文件格式,您会发现 PNG 规范非常简单。
Using the Code
首先创建一个新的 APNG
实例,然后使用 Load
函数读取文件,然后您可以循环遍历 NumEmbeddedPNG
,使用 ToBitmap
函数将每个帧保存到 PNG 文件。
这是一个示例代码:
APNG png = new APNG();
png.Load(@"animated.png");
for (int i = 0; i < png.NumEmbeddedPNG; i++)
{
Bitmap image = png.ToBitmap(i);
image.Save("frame" + i + ".png", ImageFormat.Png);
}
或者使用索引器:
APNG png = new APNG();
png.Load(@"animated.png");
for (int i = 0; i < png.NumEmbeddedPNG; i++)
{
png[i].Save("frame" + i + ".png", ImageFormat.Png);
}
除了返回一个新的 Bitmap
之外,APNG
还提供了一个 SaveFile
,您可以使用它来保存实际的帧数据(完整的原始 PNG 文件数据)。
关注点
因为我在寻找这样的代码时受了很多苦,所以我把它贡献出来,这样其他人就不会为寻找它而抓狂。 如果您有任何意见或建议,请随时告诉我,或者自己修改代码。
历史
- 版本 1.0 - 2009-5-5 首次发布
- 版本 1.1 - 2009-5-6 添加了索引器,更详细的介绍