图片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 64   #width height
255    #RGB
255 0 0
255 0 0
......
255 0 0
255 0 0
255 0 0
255 0 0
255 0 0

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

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

0000000: 5036 0a36 3420 3634 0a32 3535 0aff 0000  P6.64 64.255....
0000010: ff00 00ff 0000 ff00 00ff 0000 ff00 00ff  ................
0000020: 0000 ff00 00ff 0000 ff00 00ff 0000 ff00  ................
0000030: 00ff 0000 ff00 00ff 0000 ff00 00ff 0000  ................
0000040: ff00 00ff 0000 ff00 00ff 0000 ff00 00ff  ................

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

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

生成纯色图片代码:

 1 #include <stdio.h>
 2
 3 #define _VPATH "./../cfg/"
 4
 5 #define _B 1
 6 #define PICNUM 5
 7
 8 int main(int argc, char *argv[])
 9 {
10     if(argc != 2)
11     {
12         printf("please argc 0 or 1\n");
13         printf("0: binary image\n");
14         printf("1: decimal image\n");
15         return 0;
16     }
17
18     int iflag = atoi(argv[1]);
19
20     int i, k;
21     unsigned char r[PICNUM] = {0xFF, 0xFF, 0x0, 0x0, 0xFF};
22     unsigned char g[PICNUM] = {0x0, 0xFF, 0x0, 0x0, 0xFF};
23     unsigned char b[PICNUM] = {0x0, 0x0, 0xFF, 0x0, 0xFF};
24     FILE *fp;
25     char fname[PICNUM][100];
26
27     if(iflag == 0)
28     {
29         sprintf(fname[0], "%s%s", _VPATH, "B_red.ppm");
30         sprintf(fname[1], "%s%s", _VPATH, "B_yellow.ppm");
31         sprintf(fname[2], "%s%s", _VPATH, "B_blue.ppm");
32         sprintf(fname[3], "%s%s", _VPATH, "B_black.ppm");
33         sprintf(fname[4], "%s%s", _VPATH, "B_white.ppm");
34     }
35
36     if(iflag == 1)
37     {
38         sprintf(fname[0], "%s%s", _VPATH, "D_red.ppm");
39         sprintf(fname[1], "%s%s", _VPATH, "D_yellow.ppm");
40         sprintf(fname[2], "%s%s", _VPATH, "D_blue.ppm");
41         sprintf(fname[3], "%s%s", _VPATH, "D_black.ppm");
42         sprintf(fname[4], "%s%s", _VPATH, "D_white.ppm");
43     }
44
45     for(k = 0; k < PICNUM; k++)
46     {
47
48         if(iflag == 0)
49         {
50             fp = fopen(fname[k], "wb");
51             if(fp == NULL)
52             {
53                 printf("ERR001: open file error [%s]\n", fname);
54                 return 0;
55             }
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             }
65             fclose(fp);
66         }
67
68         if(iflag == 1)
69         {
70             fp = fopen(fname[k], "w");
71             if(fp == NULL)
72             {
73                 printf("ERR001: open file error [create_ppm]\n");
74                 return 0;
75             }
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             }
83             fclose(fp);
84         }
85     }
86     return 1;
87 }

 1     if(iflag == 3)
 2     {
 3         int c;
 4         char fname_D[100];
 5         int w = 50, h = 50;
 6         sprintf(fname_D, "%s%s", _VPATH, "D_image.ppm");
 7
 8         fp = fopen(fname_D, "w");
 9         if(fp == NULL)
10         {
11             printf("ERR003: open file error [%s]\n", fname_D);
12             return 0;
13         }
14         fprintf(fp, "%s\n", "P3");
15         fprintf(fp, "%s\n", "150 100");
16         fprintf(fp, "%s\n", "255");
17         for(i = 0; i < h; i++)
18         {
19             for(c = 0; c < w; c++)
20             {
21                 fprintf(fp, "%d %d %d\n", 0xFF, 0x0, 0x0);
22             }
23             for(c = 0; c < w; c++)
24             {
25                 fprintf(fp, "%d %d %d\n", 0xFF, 0xFF, 0x0);
26             }
27             for(c = 0; c < w; c++)
28             {
29                 fprintf(fp, "%d %d %d\n", 0xFF, 0xF1, 0xFF);
30             }
31         }
32
33         for(i = 0; i < h; i++)
34         {
35             for(c = 0; c < w; c++)
36             {
37                 fprintf(fp, "%d %d %d\n", 0x0, 0x0, 0xFF);
38             }
39             for(c = 0; c < w; c++)
40             {
41                 fprintf(fp, "%d %d %d\n", 0xFF, 0x1F, 0xFF);
42             }
43             for(c = 0; c < w; c++)
44             {
45                 fprintf(fp, "%d %d %d\n", 0x0, 0xa0, 0x0);
46             }
47         }
48         fclose(fp);
49
50     }
时间: 2024-10-26 00:36:05

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

使用 JavaScript 获取图片 base64 编码格式的文本

function getBase64Image(img) { // Create an empty canvas element var canvas = document.createElement("canvas"); canvas.width = img.width; canvas.height = img.height; // Copy the image contents to the canvas var ctx = canvas.getContext("2d&q

图片存储格式 PNM 以及 PBM/PGM/PPM

图片的存储格式之一是PNM--实际上是PBM.PGM.PPM三种格式的统称.这三种格式的语法很接近,分别对就黑白图片.灰度图片和彩色图片. PNM是"Portable Any Map"的缩写. PNM文件可以用程序xview或kview打开. PPM格式的图片 ppm格式可以是二进制的,也可以是纯文本的.两者的区别主要是像素数据用二进制表示还是用纯文本表示. 纯文本格式的PPM非常适合于简单的图片输出--因为不需要复杂的图片处理library. 下面是一个纯文本PPM格式的图片 文件的

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

原文地址:http://www.cnblogs.com/youring2/archive/2012/07/13/2590010.html#setFileUploadLimit SWFUpload v2.5.0 Documentation Table of Contents 内容列表 详情请点击翻译:yukon12345 2010.6.10 SWFUpload SWFUpload 版本 2 概览 (Overview) 入门( Getting Started) js对象 (SWFUpload Jav

Android高效内存1:一张图片占用多少内存

在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用.而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可以带来直接的效果.本文就简单介绍一张图片到底占用多少内存,我们先假设我们有一张图片时 600 * 800 的,图片占用空间大小假设是 100KB. 图片内存大小跟占用空间大小有什么关系? 占用空间的大小不是图片占用内存的大小,一些初学者可能会误解一下.占用空间是在磁盘上占用的控件,内存大小是加载到内存中占用的内存大小.两个只是单位是一样的,

第一章 计算机网络概述

计算机网络原理精讲视频教程 第1章 计算机网络概述 局域网 覆盖范围小 自己花钱购买设备 带宽固定 自己维护 100米 带宽 10M 100M 1000M 广域网 距离远 花钱租带宽 Internet ISP 自己的机房 对网民提供访问Internet连接 理解OSI参考模型分层       第一层 应用层  (所有能产生网络流量的程序)       第二层 表示层  (数据在传送前是否进行 加密 .压缩 或 ACS码(文档类型) /二进制(图片) ,编码格式(显示乱码问题))       第三

【转】SWFUpload 官方说明文档(2.5.0版)

原文出自:http://www.runoob.com/w3cnote/swfupload-document.html SWFUpload使用指南请查阅:http://www.w3cschool.cc/w3cnote/swfupload-guide.html 内容列表 SWFUpload SWFUpload 版本 2 概览 (Overview) 入门( Getting Started) js对象 (SWFUpload JavaScript Object) 构造器(Constructor) 全局变量

Jmeter测试上传图片base64编码接口

最近遇到一个项目,接口中有需要上传图片的字段,它是以图片base64编码格式的形式传递的.(Base64目前主要用于HTML5.移动开发等不考虑IE6的场景中.)请求报文示例如下: 关于如何测试实现的问题: 1)如何对图片进行编码?2)为了实现接口自动化测试,如何能实现自动base64编码 解决方案: 方法1:利用图片在线转码base64编码网站进行编码.编码网站:http://tool.css-js.com/base64.html 上传本地图片,根据需要勾选:"包含头"等选项,生成图

读取视屏文件,保存帧图片为ppm文件

ffmpeg跟sdl的学习过程:一.版本信息:ffmpeg-3.0.2.tar.bz2SDL2-2.0.4.tar.gz二.编译过程:1.ffmgeg的编译:./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpegmakemake install 2.sdl的编译:./configure --prefix=/usr/local/sdlmakemake install 3.系统环境配置:查看/etc/ld.so.co

java 图片文件Base64编码与二进制编码格式互相转换

1 public static byte[] base64String2ByteFun(String base64Str){ 2 BASE64Decoder decoder = new BASE64Decoder(); 3 byte[] b = null; 4 try { 5 b = decoder.decodeBuffer(base64Str); 6 for (int i = 0; i < b.length; ++i) { 7 if (b[i] < 0) { 8 b[i] += 256; 9