将ppm图像转换为灰度图像

问题描述 投票:0回答:1

我有一个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文件,但是新图像无法完全填充相应的区域。现在,转换后的灰度图像会在图像的前三分之一中并排出现三遍,而下部为黑色。

谢谢!

c
1个回答
0
投票

如果要使前60个字节保持相同,则不应越过它们,而应从源中读取60个字节,然后将其写入目标。

也请检查此链接以查看为什么while(!feof(in))是个坏主意:Why is “while ( !feof (file) )” always wrong?

最后,您只写入1/3的数据。您可以重复fprintf(out,"%d\n",(number1+number2+number3)/3); 3次以解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.