65.9K
CodeProject 正在变化。 阅读更多。
Home

APNG 查看器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (12投票s)

2009年5月5日

CPOL

2分钟阅读

viewsIcon

368109

downloadIcon

6197

解析并将 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 文件格式有一个简要的了解。

示例文件

其他语言

也许您正在寻找其他语言的版本。 如下所示:

工作原理

它像 .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 添加了索引器,更详细的介绍
© . All rights reserved.