PPM图像格式介绍

直接拿具体的数据来说明是最直接的,使用ue打开ppm文件,采用的都是十六进制asc码表示的,这里要注意地址00000000h中的最后一个字母是始终不变的,这原来没注意晕了我好久,第一行

50=P,

36=6,

20=空格,

直到255后面的0A=换行

之后就是数据B3 B3 B3分别对应第一个像素的rgb通道,

再之后是第二个像素的rgb通道

直到图像中第一行所有的数据都存进来,网上有人说每一行后面有个回车换行,事实上打开的文件一共是ecb8=60600行,再乘以每行十六个数(f),一共有969600个数据,正好等于800*404*3,所以事实上我做使用的p6格式的ppm文件数据里面是没有回车换行的,所有数据都是连续存储的.这样就清楚了.

下面是网上的关于该文件的一些解释,也放到这里了.

PPM图像格式是由Jef Poskanzer 大叔,在我出生那一年,也就是1991年所创造的,碰巧的是PPM也是天蝎座。

PPM(Portable Pixmap Format)还有两位兄长,大哥名叫「PBM」,二哥人称「PGM」,他们三兄弟各有所长,下面为你们一一介绍:

PBM 是位图(bitmap),仅有黑与白,没有灰

PGM 是灰度图(grayscale)

PPM 是通过RGB三种颜色显现的图像(pixmaps)

每个图像文件的开头都通过2个字节「magic number」来表明文件格式的类型(PBM, PGM, PPM),以及编码方式(ASCII 或 Binary),magic number分别为P1、P2、P3、P4、P5、P6。

Magic Number

Type

Encoding

P1

Bitmap

ASCII

P2

Graymap

ASCII

P3

Pixmap

ASCII

P4

Bitmap

Binary

P5

Graymap

Binary

P6

Pixmap

Binary

编码方式

ASCII格式适合人类阅读理解,可以用文本编辑器打开,读取对应图像的数据(比如PPM格式的RGB值)。 Binary格式适合机器阅读,按照二进制形式,顺序存储图像信息,不用空格分隔,所以图像处理起来更有效率,占用空间容量更少(由于缺少空格)。

下面着重讲解PPM格式:

PPM图像格式分为两部分,分别为头部分和图像数据部分。

头部分:由3部分组成,通过换行或空格进行分割,一般PPM的标准是空格。

第1部分:P3或P6,指明PPM的编码格式,

第2部分:图像的宽度和高度,通过ASCII表示,

第3部分:最大像素值,0-255字节表示。

在这三部分中,可能会有注释。注释以#开头,例如:# CREATOR: GIMP PNM Filter Version 1.1。

图像数据部分:

ASCII格式:按RGB的顺序排列,RGB中间用空格隔开,图片每一行用回车隔开。

Binary格式:PPM用24bits代表每一个像素,红绿蓝分别占用8bits。

举例:

P3 3 2 255

255 0 0 0 255 0 0 0 255 255 255 0 255 255 255 0 0 0

P3: PPM编码格式为ASCII

3: 3列像素

2: 2行像素

255: 最大像素值

C语言读写代码

// 从文件读取PPM图片

void ppm_load(char* filename, unsigned char* out_data, int* w, int* h) { char header[1024]; FILE* fp = NULL; int line = 0; fp = fopen(filename, "rb"); // 读取图片格式(例如:"P6") // 高宽在第二行非注释数据 while(line < 2){ fgets(header, 1024, fp); if(header[0] != '#'){ ++line; } } // 读取宽高 sscanf(header,"%d %d\n", w, h); // 获取最大像素值 fgets(header, 20, fp); // get rgb data fread(*data, (*w)*(*h)*3, 1, fp); fclose(fp); } // 写ppm图像到文件 void ppm_save(char* filename, unsigned char* data, int w, int h) { FILE* fp; char header[20]; fp = fopen(filename, "wb"); // 写图片格式、宽高、最大像素值 fprintf(fp,"P6\n%d %d\n255\n",w,h); // 写RGB数据 fwrite(data, w*h*3, 1, fp); fclose(fp); }

参考网址:

https://www.cnblogs.com/oloroso/p/5846623.html?utm_source=itdadao&utm_medium=referral

https://blog.csdn.net/kinghzkingkkk/article/details/70226214

c语言读取pnm图片,ppm图像相关 - osc_p1rj1z8j的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java读取ppm图片,ppm图像格式 - 来来叔叔的小站 - OSCHINA - 中文开源技术交流社区...

    ppm是一种简单的图像格式,仅包含格式.图像宽高.bit数等信息和图像数据. 图像数据的保存格式可以用ASCII码,也可用二进制,下面只说说一种ppm格式中比较简单的一种:24位彩色.二进制保存的图像 ...

  2. python 计算面积 比计算几何慢_计算几何相关 - osc_kbyywydz的个人空间 - OSCHINA - 中文开源技术交流社区...

    计算几何相关 ##向量表示法 这里最适合的就是用一个二维点对$(a,b)$来表示了. ##点积 ${a.xb.x+a.yb.y}$ 在向量的含义下:$\vec{a}·\vec{b}=|\vec{a}| ...

  3. c语言兔子洞,数据结构水题选讲 - osc_y08db3kb的个人空间 - OSCHINA - 中文开源技术交流社区...

    [Ynoi2011]ODT \(O(nlog^2n)\) 的做法非常显然 直接把树重链剖分一下,每个点维护轻儿子的平衡树就行 但是这题 \(1e6\) 的数据范围使得 \(O(nlog^2n)\) 没 ...

  4. 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...

  5. c语言跳马思路,跳马问题 - 日拱一卒的个人空间 - OSCHINA - 中文开源技术交流社区...

    问题: 半张象棋棋盘,一马从左下角跳到右上角,只能往右跳,不能往左跳,输出所有跳步步骤. 算法1:逆向递归 #include #include typedef struct node{ int x,  ...

  6. c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...

    2019/04/27 16:02 1.宏的定义:宏定义就是预处理命令的一种,它允许用一个标识符来表示一个字符串.格式如下: #define name(宏名) stuff(字符串) 本质就是使用宏名去替 ...

  7. c语言0阶乘分之一前三十项,MuPAD使用总结 - osc_wws45aot的个人空间 - OSCHINA - 中文开源技术交流社区...

    MuPAD使用总结 一.打开notebook界面的方法: 二.notebook界面的三种区域 (一).输入区域 输入区域在打开来的时候就有,就是 ,但是之后如果还想再加,可以点击上方红色框内的图标. ...

  8. 按照c语言规首字母只能是,C语言--指针 - osc_nbqoh20k的个人空间 - OSCHINA - 中文开源技术交流社区...

    [TOC] #知识内容总结 ##为什么要学习指针? 我们已经学习了如何用数组存放多个相同类型的数据并进行运算,但数组的长度在定义时必须给定以后不能再改变.如果事先无法确定需要处理数据数量,应该如何处理 ...

  9. c语言的文件打开模式,c语言文件打开模式 - osc_b2jf5efr的个人空间 - OSCHINA - 中文开源技术交流社区...

    (转载) 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式 只可以读 只可以写 读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ab rb+ (r+ ...

最新文章

  1. 交换基本数据类型的方法swap,并影响到主方法
  2. IOS开发之sqlite封装
  3. JQuery动态执行javascript代码的方法
  4. 【数据竞赛】2020 Kaggle 10大竞赛方案汇总
  5. ppt转html5 带动画_我复刻了IPhone12这页发布会PPT
  6. cifs挂载 mount ubuntu_centos或者Ubuntu挂载windows10文件夹
  7. file 关闭_不会吧,还有人在 finally 里关闭资源?
  8. 自制试题(逻辑思维训练500题)
  9. 网络模块与RJ45水晶头接线方法
  10. Pure Strategy Game
  11. 获取属性配置config文件
  12. Java学习lesson 10
  13. sql语句查询某天、某周、某月、某年的数据
  14. css首行缩进字符间距行高_黑暗代码风格的学院:换行,间距和缩进
  15. java,go,python
  16. SMTP与ESMTP的关系和区别
  17. 心血来潮——gitlab-ce汉化版
  18. 提高Linux下打开WPS云文档速度的方法
  19. echarts饼状图隐藏标示线和标示文字
  20. 文化娱乐免费的经典PPT模板哪里可以下载?经典大气PPT模板大全

热门文章

  1. PCLINT(1) LINT 代码规范
  2. 【WEB前端】使用百度ECharts,绘制项目质量报表
  3. xp计算机管理员桌面文件没有权限,WinXP系统设置文件夹权限的操作方法
  4. Windows server 2008服务器怎么修改密码?
  5. 中国用户无法访问苹果国际版App Store
  6. 注册美区 Apple ID
  7. matlab copula工具箱,matlabcopula案例
  8. opencv打开电脑摄像头,空格控制视频录制暂停,ESC退出并保存视频
  9. 51单片机modbus通讯源码
  10. arcsde for mysql_ArcSDE 10 PostgreSQL 数据库要求