PGM 代表 便携式灰色地图 .将C语言中的2D数组保存为PNG、JPG或其他格式的图像需要花费大量精力才能将数据编码为指定格式,然后再写入文件。 然而,Netpbm格式提供了一个简单的解决方案,易于移植。
Netpbm格式是Netpbm项目使用和定义的任何图形格式。便携式pixmap格式(PPM)、便携式灰度图格式(PGM)和便携式位图格式(PBM)是设计用于在平台之间轻松交换的图像文件格式。
Netpbm是图形程序和编程库的开源软件包。它主要在Unix世界中使用,人们可以发现它包含在所有主要的开源操作系统发行版中,但也适用于macOS等。它也可以在Microsoft Windows下工作。
每个文件都以一个两字节的幻数(ASCII)开头,该数字标识文件的类型(PBM、PGM和PPM)及其编码(ASCII或二进制)。神奇的数字是大写的P,后面跟着一个数字。
ASCII格式允许人类阅读,并易于传输到其他平台;二进制格式在文件大小方面效率更高,但可能存在本机字节顺序问题。
在二进制格式中,PBM使用每像素1位,PGM使用每像素8位,PPM使用每像素24位:红色8位,绿色8位,蓝色8位。
PGM和PPM格式(ASCII和二进制版本)在X和Y维度之后和实际像素数据之前有一个用于最大值(黑白之间的灰度数)的附加参数。黑色为0,最大值为白色。每行末尾都有一个换行符。
如何编写PGM文件? 文件格式如下: 1.神奇数字“ P2 ” 2.空白(空格、制表符、CRs、LFs)。 3.A 宽度 ,格式为十进制ASCII字符。 4.空白。 5.A 身高 ,同样是ASCII十进制。 6.空白。 7.最大灰度值,同样以ASCII十进制表示。 8.空白。 9 宽度 十、 身高 灰色值,每个值以ASCII十进制表示,介于0和指定的最大值之间,由空格分隔,采用光栅格式,自上而下。
// C program to read a BMP Image and // write the same into a PGM Image file #include <stdio.h> void main() { int i, j, temp = 0; int width = 13, height = 13; // Suppose the 2D Array to be converted to Image is as given below int image[13][13] = { { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, { 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, { 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, { 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, { 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79}, { 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95 }, { 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111}, { 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127}, { 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143}, { 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159}, { 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175}, { 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191}, { 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207} }; FILE * pgmimg; pgmimg = fopen ( "pgmimg.pgm" , "wb" ); // Writing Magic Number to the File fprintf (pgmimg, "P2" ); // Writing Width and Height fprintf (pgmimg, "%d %d" , width, height); // Writing the maximum gray value fprintf (pgmimg, "255" ); int count = 0; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { temp = image[i][j]; // Writing the gray values in the 2D array to the file fprintf (pgmimg, "%d " , temp); } fprintf (pgmimg, "" ); } fclose (pgmimg); } |
在Ubuntu中编译和执行代码的步骤
- 首先,将文件另存为“ 写_pgm_img。C “.
- 要编译C文件,请打开terminal(Ctrl+Alt+T)并输入以下代码行
gcc -o write_pgm_img write_pgm_img.c
- 要执行代码,请输入
./write_pgm_img
- 这个 PGM 图像将另存为 pgmimg。pgm .
图像将如下所示:
参考: https://en.wikipedia.org/wiki/Netpbm_format