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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (9投票s)

2007 年 3 月 19 日

CPOL

3分钟阅读

viewsIcon

86546

downloadIcon

2197

用于从 System.Drawing.Image 类读取和写入 PNM 文件的类

Screenshot - sample.jpg

引言

此类支持将 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 格式描述的文章进行了更正

参考文献

© . All rights reserved.