ppm图片有2种格式, ASCII格式和binary格式.

(1)ppm头部分

由三部分组成,这三部分由回车或换行分割,但PPM的标准中是要求空格。

第一行通常是P3或P6,说明是PPM格式;

第二行是图象的宽度和高度,用ASCII来表示;

第三行是描述像素的最大颜色组成,这里允许描述超过一个字节(0-255)的颜色值。

另外可以在上面个部分的后面用#来追加注释,注释行是从#到该行末。

(2) 图像数据部分

对于ASCII格式,就是按照RGB的顺序排列,以ASCII存储,并且,RGB中间用空格隔开,图片每一行用回车隔开。

对于binary格式,就是每一个像素点的RGB值分别顺序存储并且按二进制写入文件(fwrite),没有任何分隔。

比如下面这个图片 (一共六个像素点,图片宽度为3,高度为2):

ASCII格式ppm: [R G B\n]

P3      #ASCII格式图片为 p3
64   #width height
255    #RGB ......

以上为纯红色64*64图片, 文件共4099行, 除3行头文件, "255 0 0"有 64*64行

binary格式ppm: [RGB值顺序存储,无任何分隔]

:  0a36   0a32  0aff   P6. 64.255....
: ff00 00ff ff00 00ff ff00 00ff ................
: ff00 00ff ff00 00ff ff00 ................
: 00ff ff00 00ff ff00 00ff ................
: ff00 00ff ff00 00ff ff00 00ff ................

以上为纯红色64*64图片, 二进制文件

P6 表示二进制图片, 文件头为13位, 读取文件数据部分定位使用 fseek(fp, 13, 0);

生成纯色图片代码:

 #include <stdio.h>

 #define _VPATH "./../cfg/"

 #define _B 1
#define PICNUM 5 int main(int argc, char *argv[])
{
if(argc != )
{
printf("please argc 0 or 1\n");
printf("0: binary image\n");
printf("1: decimal image\n");
return ;
} int iflag = atoi(argv[]); int i, k;
unsigned char r[PICNUM] = {0xFF, 0xFF, 0x0, 0x0, 0xFF};
unsigned char g[PICNUM] = {0x0, 0xFF, 0x0, 0x0, 0xFF};
unsigned char b[PICNUM] = {0x0, 0x0, 0xFF, 0x0, 0xFF};
FILE *fp;
char fname[PICNUM][]; if(iflag == )
{
sprintf(fname[], "%s%s", _VPATH, "B_red.ppm");
sprintf(fname[], "%s%s", _VPATH, "B_yellow.ppm");
sprintf(fname[], "%s%s", _VPATH, "B_blue.ppm");
sprintf(fname[], "%s%s", _VPATH, "B_black.ppm");
sprintf(fname[], "%s%s", _VPATH, "B_white.ppm");
} if(iflag == )
{
sprintf(fname[], "%s%s", _VPATH, "D_red.ppm");
sprintf(fname[], "%s%s", _VPATH, "D_yellow.ppm");
sprintf(fname[], "%s%s", _VPATH, "D_blue.ppm");
sprintf(fname[], "%s%s", _VPATH, "D_black.ppm");
sprintf(fname[], "%s%s", _VPATH, "D_white.ppm");
} for(k = ; k < PICNUM; k++)
{ if(iflag == )
{
fp = fopen(fname[k], "wb");
if(fp == NULL)
{
printf("ERR001: open file error [%s]\n", fname);
return ;
}
56 fprintf(fp, "%s\n", "P6");
57 fprintf(fp, "%s\n", "64 64");
58 fprintf(fp, "%s\n", "255");
59 for(i = 0; i < 64 * 64; i++)
60 {
61 fwrite(&r[k], 1, 1, fp);
62 fwrite(&g[k], 1, 1, fp);
63 fwrite(&b[k], 1, 1, fp);
64 }
fclose(fp);
} if(iflag == )
{
fp = fopen(fname[k], "w");
if(fp == NULL)
{
printf("ERR001: open file error [create_ppm]\n");
return ;
}
76 fprintf(fp, "%s\n", "P3");
77 fprintf(fp, "%s\n", "64 64");
78 fprintf(fp, "%s\n", "255");
79 for(i = 0; i < 64 * 64; i++)
80 {
81 fprintf(fp, "%d %d %d\n", r[k], g[k], b[k]);
82 }
fclose(fp);
}
}
return ;
}

     if(iflag == )
{
int c;
char fname_D[];
int w = , h = ;
sprintf(fname_D, "%s%s", _VPATH, "D_image.ppm"); fp = fopen(fname_D, "w");
if(fp == NULL)
{
printf("ERR003: open file error [%s]\n", fname_D);
return ;
}
fprintf(fp, "%s\n", "P3");
fprintf(fp, "%s\n", "150 100");
fprintf(fp, "%s\n", "");
for(i = ; i < h; i++)
{
for(c = ; c < w; c++)
{
fprintf(fp, "%d %d %d\n", 0xFF, 0x0, 0x0);
}
for(c = ; c < w; c++)
{
fprintf(fp, "%d %d %d\n", 0xFF, 0xFF, 0x0);
}
for(c = ; c < w; c++)
{
fprintf(fp, "%d %d %d\n", 0xFF, 0xF1, 0xFF);
}
} for(i = ; i < h; i++)
{
for(c = ; c < w; c++)
{
fprintf(fp, "%d %d %d\n", 0x0, 0x0, 0xFF);
}
for(c = ; c < w; c++)
{
fprintf(fp, "%d %d %d\n", 0xFF, 0x1F, 0xFF);
}
for(c = ; c < w; c++)
{
fprintf(fp, "%d %d %d\n", 0x0, 0xa0, 0x0);
}
}
fclose(fp); }

图片ppm编码格式的更多相关文章

  1. php 获取图片base64编码格式数据

    $image_file = '1.jpg'; $image_info = getimagesize($image_file); $base64_image_content = "data:{ ...

  2. PPM图片格式及其C读写代码

    PPM图像格式介绍 PPM图像格式是由Jef Poskanzer 大叔,在我出生那一年,也就是1991年所创造的,碰巧的是PPM也是天蝎座. PPM(Portable Pixmap Format)还有 ...

  3. ppm图像相关

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

  4. 重新想象 Windows 8 Store Apps (29) - 图片处理

    原文:重新想象 Windows 8 Store Apps (29) - 图片处理 [源码下载] 重新想象 Windows 8 Store Apps (29) - 图片处理 作者:webabcd介绍重新 ...

  5. PHP代码篇(五)--如何将图片文件上传到另外一台服务上

    说,我有一个需求,就是一个临时功能.由于工作开发问题,我们有一个B项目,需要有一个商品添加的功能,涉及到添加商品内容,比如商品名字,商品描述,商品库存,商品图片等.后台商品添加的接口已经写完了,但是问 ...

  6. SWFUpload简介及中文参考手册(share)

    SWFUpload SWFUpload 版本 2 概览 (Overview) 入门( Getting Started) js对象 (SWFUpload JavaScript Object) 构造器(C ...

  7. SWFUpload 2.5.0版 官方说明文档 中文翻译版

    原文地址:http://www.cnblogs.com/youring2/archive/2012/07/13/2590010.html#setFileUploadLimit SWFUpload v2 ...

  8. Android学习笔记之BitmapFactory.Options实现图片资源的加载...

    PS:小项目总算是做完了...历经20多天...素材,设计,以及实现全由自己完成...心力憔悴啊...该写写博客记录一下学习到的东西了... 学习内容: 1.使用BitmapFactory.Optio ...

  9. swfupload操作手册

    SWFUpload SWFUpload 最初是Vinterwebb.se 开发的客户端文件上传工具.它联合javascript和flash,在浏览器中提供一个优于传统上传标签 <input ty ...

随机推荐

  1. python3连接mysql

    用到模块pymysql,用pip安装 sudo pip3 install pymysql3 编写程序 import pymysql conn = pymysql.connect(host=',db=' ...

  2. 【好程序员笔记分享】——Cocoapods集成

    -iOS培训,iOS学习-------型技术博客.期待与您交流!------------ Xcode集成POD教程 准备工作: 首先我们要在我们的电脑中安装POD,进入命令行,输入如下指令 sudo  ...

  3. Scala学习笔记--隐式转换

    隐式转换的规则:1.无歧义规则:隐式转换唯有不存在其他可插入转换的前提下才能插入  若编译器有两种方法修正x+y 如convert1(x)+y,convert2(x)+y,会报错2.单一调用规则:只尝 ...

  4. win7 下的open live writer代码插件

    open live writer 是博客园官方推荐的编辑器.恰好被它的各种便利吸引住了,于是花点时间研究一下,结果又用了好长时间,因为代码插件一时安装不了.在这里推荐小伙伴们可以先去看看这篇博文:ht ...

  5. 配色问题lingo实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang !调配颜色 要依次调配红.兰.白.黑.黄五种颜色 红  兰  白  黑  黄 红  0  6  1 ...

  6. pcduino通过USB方式刷机

    最近买了块pcduino来玩,一开始也不知道怎么入手使用,就想先学着网上来刷机,可以用TF卡来刷机,也可以用U盘来刷机.由于手上只有优盘,所以采用了第二种方式.具体方法参考了网上. 本文非原创,原文来 ...

  7. keil c51编译器的一些使用心得

    现在的存储器已经不像七八年前那样昂贵了,但是ram相对于rom和eeprom的价格还是不可同样看待的,所以程序中节省内存在现在看来还是非常关键的.原因有以下几点: 1.ram的存取速度相对于eepro ...

  8. Linux 下通过脚本实现远程自动备份

    考虑到在本机上备份数据,一旦该机器硬盘出现故障,数据无法取出.远程手动备份数据费时费力且不及时.最好的方法就是通过脚本实现远程自动互备.但远程无论是通过SSH登陆,还是通过scp拷贝文件都需要输入密码 ...

  9. shell 中如何判断前一个命令是否执行成功

    shell 中如何判断前一个命令是否执行成功 通过判断返回值来解决: if [ $? -eq 0 ];then 命令正确的分支 else   命令失败的分支 fi

  10. unix c 11

    多线程(thread)    操作系统支持多进程,进程内部使用多线程.    进程是 重量级的,拥有自己 独立的内存空间.    线程是 轻量级的,不需要拥有自己 独立的内存空间,线程的内存空间:1 ...