我有一个ppm格式的彩色图像,想将其转换为灰度图像。此ppm图像的文本在ASCII代码中,当在文本编辑器中打开它时,得到以下内容:
P3
# Created by GIMP version 2.10.0 PNM plug-in
500 539
255
187
107
74
181
101
68
189
...
实际文件当然更长。我只是在这里复制了第一行。这是我一直在尝试转换的图像:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int number1;
int number2;
int number3;
FILE *in;
in = fopen("image.ppm", "rb");
FILE *out;
out = fopen("newimage.ppm", "wb");
fseek(in, 60, SEEK_SET);
fseek(out, 60, SEEK_SET);
while(!feof(in)) {
fscanf(in,"%d",&number1);
fscanf(in,"%d",&number2);
fscanf(in,"%d",&number3);
fprintf(out,"%d\n",(number1+number2+number3)/3);
}
fclose(in);
fclose(out);
return 0;
}
有两个问题:
1)标头将不会传输到新文件。如果我按上述指示执行程序,则文本编辑器将显示:
122
116
124
126
119
127
133
...
我想保持前60个字节不变,因为它们是标头的一部分,而是由空格代替。
问题2)然后,我手动插入标题行并将第一个数字(122)插入正确的位置。我现在有一个ppm文件,但是新图像无法完全填充相应的区域。现在,转换后的灰度图像在图像的前三分之一中并排出现三遍,而下部为黑色。
谢谢!
答案 0 :(得分:0)
如果要保持前60个字节相同,则不要越过它们,而应从源中读取60个字节,然后将其写入目标。
还要检查此链接,以了解为什么while(!feof(in))
是个坏主意:Why is “while ( !feof (file) )” always wrong?
最后,您只写了1/3的数据。您可以重复fprintf(out,"%d\n",(number1+number2+number3)/3);
3次来解决此问题。