托管 PNM 图像、读取器和写入器






4.80/5 (9投票s)
用于从 System.Drawing.Image 类读取和写入 PNM 文件的类

引言
此类支持将 PNM 图像格式读取到 System.Drawing.Image
中,并将其写回 PNM 格式。 它使得可以相互转换不同的图像文件格式,包括 PNM。
背景
PNM 是一种用于旧版软件的可移植位图格式。 PNM 文件格式的使用在 LINUX / UNIX 平台中更为常见。 PNM 文件格式包含三种不同的文件格式,即 PBM、PGM 和 PPM。(感谢 Andrew Kirillov 提供的更正。)
- PBM [可移植位图 - 二进制]
- PGM [可移植灰度图 - 灰度]
- PPM [可移植像素图 - 彩色]
除了 PBM 之外,所有这些文件格式都可以用 ASCII 或二进制编码编写。 编码在读取时根据每个 PNM 文件包含的标识符(称为“魔术数字”)确定。 这始终是 PNM 文件的第一个标记。
- "P1" [PBM - ASCII 编码]
- "P2" [PGM - ASCII 编码]
- "P3" [PPM - ASCII 编码]
- "P4" [PBM - 二进制编码](尚未实现)
- "P5" [PGM - 二进制编码]
- "P6" [PPM - 二进制编码]
PNM 标头中的下两个标记定义图像的宽度和高度。 第四个标记是像素的最大值,仅在 PGM 和 PPM 的情况下存在。 PBM 不包含此标记。 此外,标头可以包含以“#
”字符开头的注释。
从参考部分提供的链接中了解有关这些图像格式的更多信息。
16 位扩展
PGM 和 PNM 的原始定义没有描述 16 位像素格式。 但是,它已在许多实际情况下使用,其中颜色信息的准确性/深度很重要。 此库目前不支持 16 位扩展,也许是您可以贡献的一个途径。 在此处了解更多信息。
Using the Code
System.Drawing.Image
的无参数构造函数标记为 internal,并且 System.Drawing.Bitmap
标记为密封类,因此我无法将它们继承到我的类中,因此无法遵循真正的面向对象设计。
该代码主要是一个类库,一个名为 PNM 的类包含两个重载函数以提供其功能。 由于这些函数是 static
,因此您不必创建该类的对象。
这是该类的一个示例用法
//
// Read a PNM File into System.Drawing.Image
//
System.Drawing.Image im = ShaniSoft.Drawing.PNM.ReadPNM(FileName);
//
// Writing System.Drawing.Image into a PNM File
//
ShaniSoft.Drawing.PNM.WritePNM(im, FileName);
与普通类一样,这两个函数都可能抛出 IOException
。
关注点
PNM 格式在复杂性方面非常简单。 它包含图像子类型、宽度、高度和 ASCII 格式的像素最大值。 然后将像素数据以二进制格式或 ASCII 格式附加到末尾(没有什么 BinaryReader
/BinaryWriter
无法处理的)。
历史
- 版本 1,从 C 到 C# 的转换 [仅 PGM]
- 版本 2,完整的 PNM 支持 [PBM、PGM、PPM]
- 对有关 PNM 格式描述的文章进行了更正