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部分:P3P6,指明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 datafread(*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);
}

注:如果出现 error c4996: 'fopen': This function or variable may be unsafe

解决方案,项目 =》属性 =》c/c++  =》预处理器=》点击预处理器定义,编辑,加入_CRT_SECURE_NO_WARNINGS,即可。

PPM图片格式及其C读写代码相关推荐

  1. C# 图片格式转换的实例代码

    C# 图片格式转换的实例代码 这篇文章主要介绍了C# 图片格式转换的实例代码,文中讲解非常详细,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下 在日常工作中,经常需要不同格式的图片,有时还需要进 ...

  2. 使用Qt实现图片格式转换[领卓教育]

    [领卓教育]使用Qt实现图片格式转换 主要实现代码 int app::save_file(){ QString filename1 = QFileDialog::getSaveFileName(thi ...

  3. MATLAB 绘制论文图片格式设置万能代码模板

    绘图在数学建模.撰写论文时是必不可少的,MATLAB 就是其中一个非常实用的工具.这次给大家分享一个我收藏并用了很久的万能MATLAB绘图模板,本人曾用这个模板绘制过数模国赛.美赛以及电磁杯论文中的绝 ...

  4. java读取ppm图片_C++ 输出PPM格式图片文件

    ##PPM简介 学习图形学时为了直观地观察结果,需要输出图片,而PPM是一种最简单的图片格式,非常适合新手使用. PPM文件的内容大概是这样的: 第一行固定为P3,代表写入的是PPM格式的RGB图像, ...

  5. PGM图片格式与代码

    这两天在搞神经网络,里面的一个人脸数据库的图片格式是PGM,其实之前早就知道了这个图片格式,但是没去深究这个图片格式的数据到底是什么安排的.搜索了下百度百科,发现介绍的真是简单,下面就自己来系统地整理 ...

  6. Winform中实现图片格式转换(附代码下载)

    场景 选择一张照片并选择保存位置和要转换的图片格式实现图片格式转换. 项目运行效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸 ...

  7. bmp转换tiff c++代码_如何快速转换图片格式

    Pixillion是Mac上的一款简单实用的图片格式转换工具.可以在gif, jpg, png, pdf等格式间相互转换,快速转换图像文件为你想要的格式并上传到网站,减小文件体积(如用于发送电子邮件) ...

  8. 3行代码用python实现图片格式转换

    目录 前沿 代码实现 结果展示 前沿 对于图片的不同格式对于现如今的PC机来讲查看是完全没有问题的,但对于部分软件,要想实现图片的上传就只能是几种常见的数据格式,如:.jpg..png..jpeg等格 ...

  9. python 获取图片内容的坐标代码(图片格式为png)

    # coding:utf-8 import cv2 import numpy as np from PIL import Image def get_transparency_location(ima ...

最新文章

  1. 基于Matlab的遗传算法优化BP神经网络在非线性函数拟合中的应用
  2. jQuery-切换2
  3. Win2K下关联进程/端口之代码初步分析
  4. Android退出程序(二)——利用广播机制
  5. opencv图像清晰度计算_收藏|分析君带你认识Python中的十大图像处理工具
  6. 考虑页面置换算法,系统有m个物理块供调度,初始时全空,页面引用串长度为p,包含了n个不同的页号,无论用什么算法,缺页次数不会少于( )
  7. Python快速定位工作目录
  8. 可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动
  9. java dao 单元测试_Spring Service、Dao进行Junit单元测试
  10. linuex查看繁忙_[个人笔记] 关于linux的常见问题合集
  11. Python机器学习:多项式回归与模型泛化003过拟合与欠拟合
  12. SQL 行转列,列分行,行合并列(转)
  13. 析构函数无法命中断点. 当前无法命中断点: 没有与此行关联的调试程序的目标代码类型的可执行代码. 可能的原因包括;条件编译, 编译器优化或者......
  14. 编程的一些经历和感想
  15. Vue.js 使用 Swiper.js 在 iOS 11 时出现错误
  16. SpringBoot 添加junit单元测试+Spring Boot 的测试类库
  17. 端口扫描工具是什么?端口扫描工具有什么用
  18. git pull git_Git Pull解释
  19. maven Filtering true 作用
  20. 【今日CV 计算机视觉论文速览 第118期】Tue, 21 May 2019

热门文章

  1. [CCC 2018] 平衡树
  2. 递归函数 集合 列表 元组
  3. 中国互联网+果汁行业商业模式创新与投资机会深度研究报告
  4. Linux 中FTP服务的应用(安装配置)
  5. Activiti——流程变量(六)
  6. 关于SpringMVC和Struts2的区别
  7. map 小模板~~~ 写的不好 继续添加
  8. android上下文关系,Android Context上下文的理解 Hua
  9. hashids php 如何使用,Hashids使用
  10. html显示数据库图片django,django将图片上传数据库后在前端显式的方法