【问题标题】:C++ how to parse a ppm file?C++如何解析一个ppm文件?
【发布时间】:2020-02-17 20:48:22
【问题描述】:

我正在尝试解析 ppm 文件。

规格是这样的:http://netpbm.sourceforge.net/doc/ppm.html

例子:


P3
# feep.ppm
4 4
15
 0  0  0    0  0  0    0  0  0   15  0 15
 0  0  0    0 15  7    0  0  0    0  0  0
 0  0  0    0  0  0    0 15  7    0  0  0
15  0 15    0  0  0    0  0  0    0  0  0

“15”之后的东西是给定图像中所有像素的rgb值。

到目前为止我已经尝试过了:




void read_and_draw_ppm_file() {
    ifstream infile;
    infile.open(TEXTURE_FILE.c_str());
    string line;
    int count = 0;
    while (getline(infile, line) && count < 4) {
        count++;
    }


    char c;

    int red = -1, green = -1, blue = -1;
    int rgb_count = 0;
    for (int i = 0; i < TEXTURE_WIDTH; i++) {
        for (int j = 0; j < TEXTURE_HEIGHT; j++) {


              infile >> c;


            if (rgb_count == 0) {
                if (red != -1 && blue != -1 && green != -1) {
                    cout << red<<endl;
                    cout << green<<endl;
                    cout << blue<<endl;


                    uint32_t colour = (255 << 24) + (int(red) << 16) + (int(green) << 8) + int(blue);
                    window.setPixelColour(i, j, colour);

                     red = -1;
                    blue = -1;
                    green = -1;
                }
                red = (int) (unsigned char) c;
                rgb_count++;

            } else if (rgb_count == 1) {
                green = (int) (unsigned char) c;
                rgb_count++;
            } else if (rgb_count == 2) {
                blue = (int) (unsigned char) c;
                rgb_count = 0;
            }
        }

    }
    infile.close();
}



这个想法基本上是提取 3 个字节的三元组,然后分别将每个转换为 rgb。

问题是,当我将图像显示到屏幕上时,图像与预期的不太一样。

我哪里错了?

原图:

渲染图图片:

【问题讨论】:

  • 和想象的不太一样:你能详细说明一下图片有什么问题吗?此外,您正在将输入文件作为字符而不是数字来读取。
  • 用预期输出/实际输出编辑
  • 您可以一次做更少的事情,如果您读取 ppm 文件,将其写回第二个文件,然后使用一些现有软件查看图像。这样你就可以找出问题是在读取文件还是在显示图像
  • 这一行red = (int) (unsigned char) c; 会给你ASCII码。将其替换为red = c - '0'。另外,想想如何处理像15 这样的数字。您正在逐字阅读。
  • 我试过这样阅读:infile &gt;&gt; c;我的输出 imqge 仍然与预期的输出不匹配

标签: c++ parsing ppm


【解决方案1】:

您读入red 的值,然后递增j。然后你读入green,并增加j。接下来读取blue,存储像素值,然后递增j

所以你每 3 行间隔写出你的值。

【讨论】:

  • 我已重置值或redgreenblue...输出图像仍然与预期图像不匹配
  • @nz_21 您只更改了窗口中每 3 个像素的像素颜色。仅当 j%3 == 0 时(j == 0 时除外)。
  • 是的,我不明白为什么这是错误的。我只在看到 3 个像素 (rgb) 后才更新像素颜色
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多