我正在尝试在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");
}
我正在将彩色图像转换为灰度。
答案 0 :(得分:1)
查看您的代码,我看到您每new line
个height
元素都插入一个// 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.