C程序以PGM格式编写图像

PGM 代表 便携式灰色地图 .将C语言中的2D数组保存为PNG、JPG或其他格式的图像需要花费大量精力才能将数据编码为指定格式,然后再写入文件。 然而,Netpbm格式提供了一个简单的解决方案,易于移植。

null

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位。

图片[1]-C程序以PGM格式编写图像-yiteyi-C++库

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中编译和执行代码的步骤

  1. 首先,将文件另存为“ 写_pgm_img。C “.
  2. 要编译C文件,请打开terminal(Ctrl+Alt+T)并输入以下代码行 gcc -o write_pgm_img write_pgm_img.c
  3. 要执行代码,请输入 ./write_pgm_img
  4. 这个 PGM 图像将另存为 pgmimg。pgm .

图像将如下所示:

图片[2]-C程序以PGM格式编写图像-yiteyi-C++库

参考: https://en.wikipedia.org/wiki/Netpbm_format

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享