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. Spring 如何初始化泛型类实例
  2. Android深入四大组件(八)广播的注册、发送和接收过程
  3. android中图型的阴影效果(shadow-effect-with-custom-shapes)
  4. AI人的Home—TechBeat!!!
  5. [转载]图的割点、桥与双连通分支
  6. jboss配置ejb容器_JBoss AS 7 EJB3池配置
  7. 剑指offer:45-48记录
  8. 软件工程项目冲刺第二天
  9. maven集成tomcat插件启动报错
  10. MGRE、OSPF综合实验
  11. readline函数重新定位到第一行_学习MATCH函数3种匹配方式,轻松确定数据位置和数量...
  12. nod32 激活码 地址 NOD 32
  13. wget: unable to resolve host address的解决方法
  14. 单片机——仿真软件Proteus基本使用教程
  15. 2021总结:万千热爱,初心不负,三餐烟火暖,四季皆安然。
  16. zigbee CC2530 系列教程 11 LCD Nokia 5110液晶实验
  17. 微信公众账号高级接口使用小结
  18. 美国如果把根域名服务器封了,中国会从网络上消失?
  19. 理科爱好者杂志理科爱好者杂志社理科爱好者编辑部2022年第3期目录
  20. 多可文档管理软件权限说明(4)——权限累加规则

热门文章

  1. Bert-chinese使用GPU运算
  2. bootstrap html编码规范
  3. 优秀网站设计欣赏的200佳网站推荐(系列九)
  4. 计算机专业mem学校排名,管理类联考考研解读:MEM院校专业排名
  5. 你好,放大器——输入失调电压(Offset Voltage,Vos)
  6. matlab中比对字符串是否完全一致_MATLAB字符串比较总结
  7. Knuth-Morris-Pratt 算法(KMP)
  8. 深入浏览器内部谈性能优化
  9. 量化交易 聚宽 多因子策略(市值, ROE)
  10. arthas 复制粘贴快捷键