在C ++中读取PPM图像缺少最后一个像素

时间:2016-02-17 16:57:52

标签: c++ matrix cin ppm

我正尝试使用以下代码从标准输入读取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图像不变时,我错过了最后一个像素。其他一切似乎都很完美。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

  

每个PPM图像由以下内容组成:

     

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

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

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