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. POJ1722 动态规划

    POJ1722 问题重述: 给定一个数组a[1,2,..,n] .定义数组第i位上的减操作:把ai和ai+1换成ai - ai+1.输入一个n位数组以及目标整数t,求一个n-1次操作序列,使得最后剩下 ...

  2. PHP基础语法随记

    PHP常量: 预定义常量: PHP自身也定义了大量的预定义常量,可以使用get_defined_constants()来查看,比较常用的预定义常量有: PHP_OS:PHP系统. PHP_VERSIO ...

  3. easy ui 实现gridview效果

    前台: // 加载审批步骤列表 function FillStep(flowID) { $('#tbStepList').datagrid({ url: "/System/ApproverS ...

  4. VM虚拟机安装苹果雪豹操作系统

    1.win xp虚拟机安装Mac OSX 一.用VM8安装mac os x10.6 ,然后升级到的10.6.8,如何安装vm大家自己百度吧.这里指列出了如何安装雪豹操作系统. DMG是mac os x ...

  5. the5fire博客对接微信公众平台接口 | the5fire的技术博客

    the5fire博客对接微信公众平台接口 | the5fire的技术博客 the5fire博客对接微信公众平台接口

  6. 程序员求职之道(《程序员面试笔试宝典》)之程序设计基础(static的使用)?

    在C语言中,关键字static的意思是静态,它有三个明显的作用:首先,在函数体内,静态变量具有"记忆"功能,即一个被声明为静态的变量在这一函数被调用过程中其值维持不变.其次,在模块 ...

  7. 新建一个MVCProject 项目

    App_Data文件夹用于存放数据库文件的 App_Start文件夹用于存放Web应用程序启动时需要进行重要配置的类文件 Content 文件夹用于存放主题样式文件 Controllers 文件夹用于 ...

  8. ubuntu下php安装xdebug

    1.安装  sudo apt-get install php5-xdebug 2.配置  修改 php .ini 路径: /etc/php5/apache2/php.ini (这里可能有不同,不同的u ...

  9. python高级编程 编写一个包1

    #目的是:编写,发行python包可重复过程"""1:是缩短开始真正工作之前所需要的设置时间,也就是提供模板2:提供编写包的标准化方法3:简化测试驱动开发方法的使用4:为 ...

  10. pyqt 托盘例子学习

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import * from PyQ ...