文档章节

ppm图像格式

来来叔叔
 来来叔叔
发布于 2017/08/04 23:57
字数 403
阅读 12
收藏 0
 
ppm是一种简单的图像格式,仅包含格式、图像宽高、bit数等信息和图像数据。
图像数据的保存格式可以用ASCII码,也可用二进制,下面只说说一种ppm格式中比较简单的一种:24位彩色、二进制保存的图像。
文件头+rgb数据:
P6\n
width height\n
255\n
rgbrgb...
其中P6表示ppm的这种格式;\n表示换行符;width和height表示图像的宽高,用空格隔开;255表示每个颜色分量的最大值;rgb数据从上到下,从左到右排放。

读取ppm图像:
// read ppm image, rgb data store in *data
void read_ppm(char* filename, unsigned char** data, int* w, int* h)
{
char header[20];
FILE* pFile;

pFile = fopen(filename, "rb");
fgets(header, 20, pFile);// get "P6"
fgets(header, 20, pFile);// get "width height"
sscanf(header,"%d %d\n", w, h);

*data = (unsigned char*) malloc((*w)*(*h)*3);

// get "255"
fgets(header, 20, pFile);

// get rgb data
fread(*data, (*w)*(*h)*3, 1, pFile);

fclose(pFile);
}

写ppm图像文件:
// giving rgb data and image width and height, write a ppm image,
void write_ppm(char* filename, unsigned char* data, int w, int h)
{
FILE* pFile;
char header[20];

pFile = fopen(filename, "wb");

// write "P6"
fwrite("P6\n", 3, 1, pFile);

// write "width height"
sprintf(header, "%d %d\n", w, h);
fwrite(header, strlen(header), 1, pFile);

// writeh "255"
fwrite("255\n", 4, 1, pFile);

// write rgb data
fwrite(data, w*h*3, 1, pFile);

fclose(pFile);
}

//清理ppm数据
// free ppm rgb data
void free_ppmdata(unsigned char** data)
{
free(*data);
*data = NULL;
}

使用举例:
int main(int argc, char* argv[])
{
unsigned char* data;
int w, h;

read_ppm("C:\\test.ppm", &data, &w, &h);
printf("ppm size: %dx%d\n", w, h);

write_ppm("C:\\test2.ppm", data, dw, dh);

free_ppmdata(&data);

printf("main() finished......\n");
return 0;
}
可以验证test2.ppm跟test.ppm是完全一致的,可以用看图软件打开。

© 著作权归作者所有

共有 人打赏支持
来来叔叔
粉丝 0
博文 100
码字总数 55732
作品 0
广州
高级程序员
OpenCV支持的图像格式

OpenCV目前支持的图像格式包括: Windows位图文件 - BMP, DIB; JPEG文件 - JPEG, JPG, JPE; 便携式网络图片 - PNG; 便携式图像格式 - PBM,PGM,PPM; Sun rasters - SR,RAS; TIFF文件 ...

moki_oschina
2016/05/20
35
0
HGL Suite 0.5.17 发布,图像编译和解析器

HGL Suite 0.5.17 发布,此版本更新内容如下: 让 netpbm 图像输出插件编写 PPM 和 PAM 提升l编译器的性能 HGL 是一个用来开发图像的编译器和解释器,自带简单但强大的语言,可通过插件来配置...

oschina
2014/01/25
230
0
GraphicsMagick的命令概览

GraphicsMagick的命令概览 ---------------------------------------------------------------------------- [ convert | identify | mogrify | composite | montage | compare | display | ......

mycms2013
2015/12/04
231
0
Qt中插入图片并在label中显示

参考:http://blog.51cto.com/whylinux/1877629 参考Qt的帮助文档,可支持的类型,即可以直接读取并显示的格式有BMP、GIF、JPG、JPEG、PNG、TIFF、PBM、PGM、PPM、XBM、XPM。具体的步骤为:先...

zong596568821xp
01/13
0
0
学习FFmpeg API – 解码视频

ffmpeg是编解码的利器,用了很久,以前看过dranger 的教程,非常精彩,受益颇多,是学习ffmpeg api很好的材料。可惜的是其针对的ffmpeg版本已经比较老了,而ffmpeg的更新又很快,有些API已经...

霄霄月月
2012/05/08
0
32

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RobotFramework之Process

Process Library version: 3.0.4 Library scope: global Named arguments: supported Introduction Robot Framework test library for running processes. This library utilizes Python's s......

海盐宝宝
刚刚
0
0
easyui的textbox赋值问题,不能用$('#text').val('text');赋值

下面来看看easyui的各种验证框赋值的方式: <input name="text" id="text" class="easyui-numberbox" > <input name="text" id="text" class="easyui-textbox" > <input name="text" id="tex......

无小农
4分钟前
0
0
弹性工作制的魔咒

简评:你找到了一份完美的工作 —— 可以提前离开公司,还可以在晚上从家里回复邮件。既然如此,你为什么还会有那么强的负罪感呢? 或许是弹性工作制魔咒在作祟。 很多享受弹性工作制的人会始...

极光推送
10分钟前
0
0
KAFKA介绍(分布式架构)

Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kafka将消息以...

明理萝
16分钟前
0
1
os::NodeHandle::subscribe回调函数绑定对象

void Foo::callback(const std_msgs::Empty::ConstPtr& message){}Foo foo_object;ros::Subscriber sub = handle.subscribe("my_topic", 1, &Foo::callback, &foo_object); 参考: ht......

itfanr
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部