.NET MNG 查看器






4.17/5 (5投票s)
一个本地 .NET 库和应用程序,用于查看 MNG 中嵌入的 PNG 图片
引言
在过去的几年里,我一直在寻找一个 .NET 库,它可以加载 MNG(多图像网络图形)动画,并允许我以“逐帧”的方式提取嵌入图像的位图。理想情况下,我希望找到一个本地 .NET 的解决方案。由于未能找到 100% 本地的 .NET 解决方案,我决定自己开发一个 MNG 库。
本文包含我对这样一个库的初步 工作。需要注意的是,该库并非完全符合 MNG 规范的 100% 兼容的 MNG 解码器。我目前唯一的愿望是从 MNG 中提取嵌入的 PNG 图片。因此,没有努力去处理 MNG 循环、Basis 对象、Delta PNG、背景、帧定义,以及其他大量的 MNG “块”。
幸运的是,我日常处理的所有 MNG 都是相当简单的,这个库满足我的需求。
背景
我不会详细介绍 MNG 是什么以及 MNG 文件格式。如果您对这篇文章感兴趣,那么很可能您已经对 MNG 有一定的了解了。
有关更多详细信息,请查看以下链接
Using the Code
附带的 ZIP 文件包含一个 Visual Studio 2008 解决方案,其中包含两个项目
- MNG 查看器 - WinForms 应用程序,用于演示库的功能
SprinterMNG
- 负责读取 MNG 的库
SprinterMNG
包含一个 public
类 MNG
。通过这个类来加载 MNG。
加载 MNG 就像这样简单
MNG mng = new MNG();
mng.Load( filename );
提取 MNG 中嵌入的 PNG 图片就像这样简单
int numEmbeddedPNG = mng.NumEmbeddedPNG;
for( int i = 0; i < numEmbeddedPNG; i++ )
{
Bitmap b = mng.ToBitmap(i);
}
我尝试构建 SprinterMNG
库,以便在库的初始版本中未涵盖的 MNG 规范元素的添加尽可能容易。
关注点
当我最初决定编写这个库时,我以为我需要自己处理(解析、解压缩、渲染)PNG 图像数据。我完成了使用 SharpZipLib 实现解压缩后,我记起 .NET 本身就支持加载 PNG 文件格式。由于 MNG 中的每个嵌入式 PNG 图像都符合 PNG 块规范,我发现我所需要做的就是将从 MNG 中提取的 PNG 数据与 PNG 文件签名前缀连接起来,以获得 PNG 格式的数据流。库中实现的 resulting 数据流(作为 MemoryStream
对象)可以用来创建位图,如下所示。
Bitmap b = (Bitmap)Bitmap.FromStream( pngs[index].ToStream() );
历史
- 2009 年 4 月 9 日 - 库和示例应用程序的初始修订版