.NET

framework框架类库中的Image类和Bitmap类提供了常用图像格式的解析读取和存储,这些常用格式包括

BMP,JEPG,GIF,PNG,EXIF,TIFF.但是可惜的是不支持PGM格式,我们要自己来处理PGM格式的文件.

1.PGM

图像详解

PGM 是便携式灰度图像格式(portable graymap file

format),在黑白超声图像系统中经常使用PGM格式的图像.文件的后缀名为".pgm",PGM格式图像格式分为两类:P2和P5类型.不管是P2

还是P5类型的PGM文件,都由两部分组成,文件头部分和数据部分.

件头部分

文件头包括的信息依 次是:

1.PGM文件的格 式类型(是P2还是P5);

2.图像的宽度;

3.图像的高度;

4.图像灰度值可能 的最大值;

文件头的这四部分信

息都是以ASCII码形式存储的,所以可以直接在将P2或P5格式的PGM文件在记事本中打开看到文件头的信息.

P5格式的PGM文 件在记事本中打开(如下图)

P2格式的PGM文

件在记事本中打开(如下图)

在P2或P5类型的

PGM文件头的4个信息之间用分割符分开,PGM的合法分隔符包括:空格,TAB,回车符,换行符.PGM文件头的信息应该由合法分割符号分开,如上面两

幅图所展.文件头的第4个信息,图像灰度值可能的最大值标明了文件数据部分可能出现的像素灰度值的最大值.上面两幅图都是指定的255,所以在数据区的像

素数据取值范围在0到255.

据部分

数据部分记录图像每

个像素的灰度值,按照图像从上到下,从左到右的顺序依次存储每个像素的灰度值.对于像素灰度值的表示P2格式和P5格式有所不同.

P5

格式

P5格式的文件,每

个像素用可以用二进制表示.比如有一幅P5格式图像,灰度值可能的最大值为255,它的第一行第一列像素值为100,那么该图像每个像素使用一个字节表

示,第一行第一列为数值为100的二进制一个字节表示.如果这副图灰度值可能的最大值是65535,那么它的第一行第一列为数值为100的二进制两个字节

表示(因为表示到65535需要两个字节).每个像素数据之间没有间隔的连续存储,图像一行信息结束后从下一行第一列继续,两行图像数据之间也没有间隔的

连续存储,直到将图像的所有信息表示完.因为是以二进制表示,所以数据部分在记事本中打开后看到的将会是乱码.

P2

格式

P2格式的文件,每

个像素使用字符串来表示,比如一副P2格式图像,灰度值可能的最大值为255,它的第一行第一列像素值为100,那么该图像图像每个像素使用3个

ASCII字符表示,第一行第一列数据为ASII表示的"100".不同于P5格式,每个像素数据之间需要用一个空格符分开存储,在图像的每一行数据结束

时需要换行.还有一点需要注意,P2格式文件数据部分当数据超过70个字节的时候,会自动换行.也就是说图像的每一行数据末尾,或者存储时超过70个字节

时,需要进行换行.

如下图所示,这是一 个P2格式的PGM文件在Visual

Studio中查看的效果.我们可以看到,每超过70个自己时候需要换行,在图像数据一行结束时候也需要换行(在0 1 1

1结束后,图像第一行数据结束换行).

java pgm_(转) PGM图像处理方法详解(很好一篇)相关推荐

  1. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  2. 好程序员Java学习路线分享finalize()方法详解

    好程序员Java学习路线分享finalize()方法详解,前言,finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法.. fi ...

  3. Java中BigInteger的各种方法详解

    顾名思义,BigInteger就是用于处理题目中涉及到大整数的加减乘除运算. 文章目录 ·int 与 BigInteger之间的相互转化 ·错误案例:BigInteger 与 int 之间不能直接相互 ...

  4. java barrier_Java并发类CyclicBarrier方法详解

    Cyclic是周期的意思,Barrier是关卡的意思.CyclicBarrier不仅有CountDownLatch的功能,还可以实现屏障等待,即阶段性同步.因此适用于,需要循环地实现线程一起做任务的目 ...

  5. java yeild_Java 中 Thread.yield() 方法详解

    对于很多初学 Java 线程的小伙伴们,很容易将 Thread 类里的 yield() 方法理解错误,或者理解得不够透彻,先看下源码: public static native void yield( ...

  6. arraylist java 排序_Java ArrayList排序方法详解

    由于其功能性和灵活性,ArrayList是 Java 集合框架中使用最为普遍的集合类之一.ArrayList 是一种 List 实现,它的内部用一个动态数组来存储元素,因此 ArrayList 能够在 ...

  7. 基于Java内存溢出的解决方法详解

    一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建:非堆 ...

  8. java finalize逃脱_java finalize方法详解

    1. finalize的作用 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法. finalize()与C++中的析构函数 ...

  9. Java线程中的sleep方法详解

    文章目录 1.关于线程的sleep方法 2.分析哪个线程休眠的 3.终止线程的休眠 4.终止线程 强行终止线程 合理的终止线程 1.关于线程的sleep方法 static void sleep(lon ...

  10. Java MD5 VS SAH 加密方法详解

    引用百度描述: MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Da ...

最新文章

  1. Web Api学习一
  2. 程序员崩溃的10个瞬间
  3. R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_ellipse函数在数据簇或数据分组的数据点周围添加椭圆(ellipse)进行注释(对椭圆包围的区域进行着色为阴影区域)
  4. zabbix简单入门
  5. ironpython不想要可以卸载吗_使用IronPython给.Net程序
  6. 多对多关联查询sql语句
  7. WPF richTextBox 滚动到某项
  8. vscode python语法检查开启_VS Code 自动运行python
  9. 使用winedt写论文遇到的一些小问题
  10. 华为ipd项目管理流程_从偶然成功到持续成功—华为IPD体系的建设
  11. Arduino与Proteus仿真实例-74HC573锁存器驱动仿真
  12. Python 网络编程入门——用 Socket 做一个风花雪月服务器
  13. 中南大学2021计算机专硕复试分数线,2021年中南大学研究生录取分数线是多少
  14. Vue Router 实现路由控制实战
  15. Qt弹出标准对话框的方法
  16. Git原理杂谈之pull/push命令
  17. python输入一个字符一个数字_Python程序输入一个字符串并查找字母和数字的总数...
  18. 计算机教育专业的专业任选课,什么叫自由选修课 又什么叫全校任选课
  19. 保持好距离才会保持好爱情!情侣间最好的距离!很值得一看!
  20. 服务器2008 r2开启远程桌面连接不上,windows server 2008 R2怎么开启远程桌面_windows server 2008 R2开启远程桌面的步骤...

热门文章

  1. 驰骋山海间,天地亦征途——记2022云创大数据优秀员工西域狂野自驾之旅
  2. lightoj1224 DNA Prefix
  3. Windows 8轻松用系列
  4. 站队(使用插入排序完成) (Standard IO)————c++插入排序
  5. windows任务栏IDEA图标变白色快速解决方法
  6. 保研一年来的心路历程
  7. 脚踩智能汽车春风,百度踏上千亿美元市值征程
  8. 天下武功唯快不破--速度要快
  9. coldfusion_ColdFusion MX 7功能之旅
  10. docker是干什么的_Docker超简单入门教程