图片ppm编码格式
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编码格式的更多相关文章
- php 获取图片base64编码格式数据
$image_file = '1.jpg'; $image_info = getimagesize($image_file); $base64_image_content = "data:{ ...
- PPM图片格式及其C读写代码
PPM图像格式介绍 PPM图像格式是由Jef Poskanzer 大叔,在我出生那一年,也就是1991年所创造的,碰巧的是PPM也是天蝎座. PPM(Portable Pixmap Format)还有 ...
- ppm图像相关
PPM图像格式介绍 直接拿具体的数据来说明是最直接的,使用ue打开ppm文件,采用的都是十六进制asc码表示的,这里要注意地址00000000h中的最后一个字母是始终不变的,这原来没注意晕了我好久,第 ...
- 重新想象 Windows 8 Store Apps (29) - 图片处理
原文:重新想象 Windows 8 Store Apps (29) - 图片处理 [源码下载] 重新想象 Windows 8 Store Apps (29) - 图片处理 作者:webabcd介绍重新 ...
- PHP代码篇(五)--如何将图片文件上传到另外一台服务上
说,我有一个需求,就是一个临时功能.由于工作开发问题,我们有一个B项目,需要有一个商品添加的功能,涉及到添加商品内容,比如商品名字,商品描述,商品库存,商品图片等.后台商品添加的接口已经写完了,但是问 ...
- SWFUpload简介及中文参考手册(share)
SWFUpload SWFUpload 版本 2 概览 (Overview) 入门( Getting Started) js对象 (SWFUpload JavaScript Object) 构造器(C ...
- SWFUpload 2.5.0版 官方说明文档 中文翻译版
原文地址:http://www.cnblogs.com/youring2/archive/2012/07/13/2590010.html#setFileUploadLimit SWFUpload v2 ...
- Android学习笔记之BitmapFactory.Options实现图片资源的加载...
PS:小项目总算是做完了...历经20多天...素材,设计,以及实现全由自己完成...心力憔悴啊...该写写博客记录一下学习到的东西了... 学习内容: 1.使用BitmapFactory.Optio ...
- swfupload操作手册
SWFUpload SWFUpload 最初是Vinterwebb.se 开发的客户端文件上传工具.它联合javascript和flash,在浏览器中提供一个优于传统上传标签 <input ty ...
随机推荐
- POJ1722 动态规划
POJ1722 问题重述: 给定一个数组a[1,2,..,n] .定义数组第i位上的减操作:把ai和ai+1换成ai - ai+1.输入一个n位数组以及目标整数t,求一个n-1次操作序列,使得最后剩下 ...
- PHP基础语法随记
PHP常量: 预定义常量: PHP自身也定义了大量的预定义常量,可以使用get_defined_constants()来查看,比较常用的预定义常量有: PHP_OS:PHP系统. PHP_VERSIO ...
- easy ui 实现gridview效果
前台: // 加载审批步骤列表 function FillStep(flowID) { $('#tbStepList').datagrid({ url: "/System/ApproverS ...
- VM虚拟机安装苹果雪豹操作系统
1.win xp虚拟机安装Mac OSX 一.用VM8安装mac os x10.6 ,然后升级到的10.6.8,如何安装vm大家自己百度吧.这里指列出了如何安装雪豹操作系统. DMG是mac os x ...
- the5fire博客对接微信公众平台接口 | the5fire的技术博客
the5fire博客对接微信公众平台接口 | the5fire的技术博客 the5fire博客对接微信公众平台接口
- 程序员求职之道(《程序员面试笔试宝典》)之程序设计基础(static的使用)?
在C语言中,关键字static的意思是静态,它有三个明显的作用:首先,在函数体内,静态变量具有"记忆"功能,即一个被声明为静态的变量在这一函数被调用过程中其值维持不变.其次,在模块 ...
- 新建一个MVCProject 项目
App_Data文件夹用于存放数据库文件的 App_Start文件夹用于存放Web应用程序启动时需要进行重要配置的类文件 Content 文件夹用于存放主题样式文件 Controllers 文件夹用于 ...
- ubuntu下php安装xdebug
1.安装 sudo apt-get install php5-xdebug 2.配置 修改 php .ini 路径: /etc/php5/apache2/php.ini (这里可能有不同,不同的u ...
- python高级编程 编写一个包1
#目的是:编写,发行python包可重复过程"""1:是缩短开始真正工作之前所需要的设置时间,也就是提供模板2:提供编写包的标准化方法3:简化测试驱动开发方法的使用4:为 ...
- pyqt 托盘例子学习
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import * from PyQ ...