图片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 ...
随机推荐
- Labeling Balls--poj3687
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12273 Accepted: 3516 D ...
- iOS基本的发短信和打电话调用
电话.短信是手机的基础功能,iOS中提供了接口,让我们调用.这篇文章简单的介绍一下iOS的打电话.发短信在程序中怎么调用. 1.打电话 [[UIApplication sharedApplicatio ...
- Unix 主机认证配置
A机用户: ssh-keygen -t rsa ssh-keygen -t dsa cd .ssh cat *.pub >>authorized_keys ---注意一定要追加,不然会覆 ...
- Azure Storage Client Library 重试策略建议
有关如何配置 Azure Storage Library 重试策略的信息,可参阅 Gaurav Mantri 撰写的一篇不错的文章<SCL 2.0 – 实施重试策略>.但很难找到关于使用何 ...
- jquery IE6 select.val() bug报错解决办法
原文地址:http://hi.baidu.com/kinghmx/item/395dbac3261292dcef183b52 最近在写一个页面,在出了ie6外的所有浏览器中都正常(ie7,8,9, ...
- Jquery局部打印插件
局部打印插件 jquery.PrintArea.js js代码 (function ($) { var printAreaCount = 0; $.fn.printArea = fun ...
- 漏洞:WebRTC 泄漏用户IP
WebRTC又称为“网页即时通信”,是一组API函数,它经过W3C组织的认证,支持浏览器之间的语音通话.视频聊天和P2P模式分享文件. 这个协议主要包括:getUserMedia,RTCPe ...
- hdu 5650 so easy (异或)
我们考虑集合中的每个数x对答案的贡献. 设集合有n个数,则包含x的子集个数有2^(n-1)个. 那么当n > 1时,x出现了偶数次,所以其对答案的贡献就是0:当 n = 1时,其对答案的贡献是 ...
- Cookie知识点小结
问题是什么?有哪些技术?如何解决? 1. Cookie 1)完成回话跟踪的一种机制:采用的是在客户端保存Http状态信息的方案 2)Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在 ...
- android jni (5)——Field & Method --> Accessing Mehtod
在java编程语言中有非静态成员函数和静态成员函数,JNI允许我们访问到java中的成员函数,然后再jni中调用,这里我就来举例说明在jni中是如何做到的. 我们先在java中定义2个成员函数,一个非 ...