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. 从运行原理及使用场景看Apache和Nginx

    用正确的工具,做正确的事情. 本文只作为了解Apache和Nginx知识的一个梳理,想详细了解的请阅读文末参考链接中的博文. Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务 ...

  2. 基于cygwin构建u-boot(四)libgcc引用

    接上文,config.mk文件修改后,即使没有.depend也可以正常处理了: 六.错误:gcclib引用错误 完成之前几篇的工作后,程序就可以一直执行了,直到最后生成u-boot, 出现如下错误告警 ...

  3. 字符串:各种奇葩的内置方法 - 零基础入门学习Python014

    字符串:各种奇葩的内置方法 让编程改变世界 Change the world by program 字符串:各种奇葩的内置方法 或许现在又回过头来谈字符串,有些朋友可能会觉得没必要,也有些朋友会觉得不 ...

  4. Effective Java2读书笔记-类和接口(二)

    第15条:使可变性最小化 通过一个复数类来看不可变类. public final class Complex { private final double re; private final doub ...

  5. PowerShell3.0中,所有的命令

    Get-Command * >> cmd.txt CommandType Name ModuleName ----------- ---- ---------- Alias % -> ...

  6. Reverse Nodes in k-Group 解答

    Question Given a linked list, reverse the nodes of a linked list k at a time and return its modified ...

  7. 新建一个MVCProject 项目

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

  8. mycat实例(3)

    配置MyCat 4. 配置schema.xml schema.xml里面管理着MyCat的逻辑库.表,每张表使用的分片规则.分布在哪个DataNode以及DataSource上. 之前的例子: < ...

  9. New Year Transportation(水)

    New Year Transportation Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  10. 计算直线的交点数(set + 打表)

    计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...