用C编写PGM文件不起作用

时间:2012-02-27 16:26:09

标签: c pgm

我正在尝试在C程序中编写PGM文件,但是一旦编写完成,如果我尝试打开它来查看图像,我被告知图像文件格式无法确定。

但是,如果我在geany中创建一个新文件,复制数据,然后将其保存为新的PGM,它就可以工作。

知道为什么会这样吗?

FILE * grey = fopen("greyscale.pgm", "w");

fprintf(grey, "P2 \r\n%d %d \r\n255 \r\n", width, height);

for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
        fprintf(grey, "%d ", ((imageArray[i][j].red + imageArray[i][j].green + imageArray[i][j].blue)/3));
    }
    fprintf(grey, "\r\n");
}

我正在将彩色图像转换为灰度。

2 个答案:

答案 0 :(得分:1)

查看您的代码,我看到您每new lineheight元素都插入一个// write data to file int row, col; for (row = 0; row < height; ++row) { for (col = 0; col < width; ++col) { fprintf(grey, "%d ", (imageArray[row][col].red + imageArray[row][col].green + imageArray[row][col].blue)/3)); } fprintf(grey, "\n\r"); } 。根据PGM文件格式,在标题之后,按照

  • 高度行的栅格,按从上到下的顺序排列。每行由宽度灰度值组成,按从左到右的顺序排列。

但是你正在写一排高度元素。因此,您可能以错误的方式访问数据。实际上,尝试调试(使用铅笔)3列(宽度)和4行(高度)的图像。

说,改变循环以按行主顺序写入数据:

{{1}}

答案 1 :(得分:1)

我认为您不应该使用\r\n作为行分隔符,而只应使用\n。另外,检查没有行的长度超过70个字符。由于每个像素最多需要4个字符(3个空格),因此在每17个像素后插入\n。 您可以使用注释分隔实线(例如:

pixel11 pixel12 pixel13
pixel14 pixel15
# switch to next row
pixel21 pixel22 pixel23
pixel24 pixel25
# etc.