c语言读取pnm图片,ppm图像相关 - osc_p1rj1z8j的个人空间 - OSCHINA - 中文开源技术交流社区...
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 - 中文开源技术交流社区...相关推荐
- java读取ppm图片,ppm图像格式 - 来来叔叔的小站 - OSCHINA - 中文开源技术交流社区...
ppm是一种简单的图像格式,仅包含格式.图像宽高.bit数等信息和图像数据. 图像数据的保存格式可以用ASCII码,也可用二进制,下面只说说一种ppm格式中比较简单的一种:24位彩色.二进制保存的图像 ...
- python 计算面积 比计算几何慢_计算几何相关 - osc_kbyywydz的个人空间 - OSCHINA - 中文开源技术交流社区...
计算几何相关 ##向量表示法 这里最适合的就是用一个二维点对$(a,b)$来表示了. ##点积 ${a.xb.x+a.yb.y}$ 在向量的含义下:$\vec{a}·\vec{b}=|\vec{a}| ...
- c语言兔子洞,数据结构水题选讲 - osc_y08db3kb的个人空间 - OSCHINA - 中文开源技术交流社区...
[Ynoi2011]ODT \(O(nlog^2n)\) 的做法非常显然 直接把树重链剖分一下,每个点维护轻儿子的平衡树就行 但是这题 \(1e6\) 的数据范围使得 \(O(nlog^2n)\) 没 ...
- 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...
一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...
- c语言跳马思路,跳马问题 - 日拱一卒的个人空间 - OSCHINA - 中文开源技术交流社区...
问题: 半张象棋棋盘,一马从左下角跳到右上角,只能往右跳,不能往左跳,输出所有跳步步骤. 算法1:逆向递归 #include #include typedef struct node{ int x, ...
- c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...
2019/04/27 16:02 1.宏的定义:宏定义就是预处理命令的一种,它允许用一个标识符来表示一个字符串.格式如下: #define name(宏名) stuff(字符串) 本质就是使用宏名去替 ...
- c语言0阶乘分之一前三十项,MuPAD使用总结 - osc_wws45aot的个人空间 - OSCHINA - 中文开源技术交流社区...
MuPAD使用总结 一.打开notebook界面的方法: 二.notebook界面的三种区域 (一).输入区域 输入区域在打开来的时候就有,就是 ,但是之后如果还想再加,可以点击上方红色框内的图标. ...
- 按照c语言规首字母只能是,C语言--指针 - osc_nbqoh20k的个人空间 - OSCHINA - 中文开源技术交流社区...
[TOC] #知识内容总结 ##为什么要学习指针? 我们已经学习了如何用数组存放多个相同类型的数据并进行运算,但数组的长度在定义时必须给定以后不能再改变.如果事先无法确定需要处理数据数量,应该如何处理 ...
- c语言的文件打开模式,c语言文件打开模式 - osc_b2jf5efr的个人空间 - OSCHINA - 中文开源技术交流社区...
(转载) 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式 只可以读 只可以写 读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ab rb+ (r+ ...
最新文章
- Spring 如何初始化泛型类实例
- Android深入四大组件(八)广播的注册、发送和接收过程
- android中图型的阴影效果(shadow-effect-with-custom-shapes)
- AI人的Home—TechBeat!!!
- [转载]图的割点、桥与双连通分支
- jboss配置ejb容器_JBoss AS 7 EJB3池配置
- 剑指offer:45-48记录
- 软件工程项目冲刺第二天
- maven集成tomcat插件启动报错
- MGRE、OSPF综合实验
- readline函数重新定位到第一行_学习MATCH函数3种匹配方式,轻松确定数据位置和数量...
- nod32 激活码 地址 NOD 32
- wget: unable to resolve host address的解决方法
- 单片机——仿真软件Proteus基本使用教程
- 2021总结:万千热爱,初心不负,三餐烟火暖,四季皆安然。
- zigbee CC2530 系列教程 11 LCD Nokia 5110液晶实验
- 微信公众账号高级接口使用小结
- 美国如果把根域名服务器封了,中国会从网络上消失?
- 理科爱好者杂志理科爱好者杂志社理科爱好者编辑部2022年第3期目录
- 多可文档管理软件权限说明(4)——权限累加规则