【问题标题】:Reading PPM image in C++ missing last pixel在 C++ 中读取 PPM 图像缺少最后一个像素
【发布时间】:2016-02-17 16:57:52
【问题描述】:

我正在尝试使用以下代码从标准输入读取 PPM 图像:

cin >> format;
cin >> ppm->width >> ppm->height >> ppm->colourMax;

for (int r = 0; r < ppm->height; r++) {
  ppm->pixels[r] = new Pixel[ppm->width];
  for (int c = 0; c < ppm->width; c++) {
    Pixel p = Pixel();
    cin.read(reinterpret_cast<char *>(&p.r), sizeof(unsigned char));
    cin.read(reinterpret_cast<char *>(&p.g), sizeof(unsigned char));
    cin.read(reinterpret_cast<char *>(&p.b), sizeof(unsigned char));
    ppm->pixels[r][c] = p;
  }
}

但是,当我输出 PPM 图像不变时,我错过了最后一个像素。其他一切似乎都完美无缺。有什么想法吗?

【问题讨论】:

  • 尚未检查,但您可能缺少 first 像素?
  • 缺少哪些像素坐标?这是否因输入图像的大小而异?您是否尝试过多个源图像文件?
  • 当我将原始文件与输出进行比较时,原始文件末尾有 1 个额外字节。
  • 另外值得注意的是,您可以声明Pixel&amp; p = ppm-&gt;pixels[r][c] 并避免创建无用的中间变量。那样复制就少了。
  • 一个字节对于一个像素是不够的,因为您的代码每个像素读取 3 个字节。那个额外的字节是什么?你的系统是什么?

标签: c++ matrix cin ppm


【解决方案1】:

PPM file format 的所有变体在colourMax 参数后面都有一个空格字符:

每个 PPM 图像包含以下内容:

...
5. 高度,同样是 ASCII 十进制。
6. 空白。
7. 最大颜色值(Maxval),同样以 ASCII 十进制表示。必须小于 65536 且大于零。
8.单个空白字符(通常是换行符)。
...

在您的代码中,由于read() 从当前位置开始读取,因此不会从流中提取这个额外的空格。当您读取固定数量的字符时,这个额外的空间会导致您的代码忽略最后一个字符。

解决方案:在开始阅读循环之前只需 cin.ignore();

【讨论】:

    猜你喜欢
    • 2010-11-22
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2015-05-07
    • 2016-07-11
    相关资源
    最近更新 更多