如何将PPM(P3)图像中的像素数据读入C中的矩阵?

时间:2017-02-22 19:58:03

标签: c matrix ppm

我想要一个矩阵,每行对应一个像素,每列是来自PPM P3图像的R G B值。

我尝试使用[imageWidth * imageHeight] [3]创建一个矩阵,然后填充它,但它似乎需要永远。我想我错过了一些东西,任何人都可以解释我哪里出错了或者建议更好的方法来做到这一点?

  int  pixels [imageSize] [3];

while(fgets(line,70,fd) != NULL){
  for ( column = 0; column < (imageSize); column++){
    for ( row = 0; row < 1; row++){
      sscanf(line, "%d %d %d", &r, &g, &b );
      pixels [column] [row] = r;
      pixels [column] [row + 1] = g;
      pixels [column] [row + 2] = b;
     }
  }
}

Line指的是fgets函数读入的行。

1 个答案:

答案 0 :(得分:1)

问题在修改后的代码中很明显:您尝试从每个栅格线读取图像的所有像素。除非fgets()无限期地阻塞,否则这将不会永远 ,但如果栅格尺寸较大且文件由多行像素组织,则可能需要很长时间。在任何情况下,它都是 错误 ,因为在最外层循环的每次迭代中 - 也就是说,对于每行读取 - 它会覆盖所有先前分配的像素值。

此外,你最内层的循环,虽然并非实际上是错误的,但却是高度混淆的。它总是执行一次迭代;其迭代变量row实际上是索引像素组件(而不是栅格的行),而row无论如何在每次迭代时都具有值0。最好将其删除。

总的来说,你所做的比这更难。 PPM P3格式的设计使其能够通过更简单的代码进行输入。有效PPM P3文件中的每个样本都保证前后有空格。另一方面,字段的位置和宽度以及每行的数量不固定。这些特征共同构成了fscanf()实际上比fgets() + sscanf()更好的选择。行长限制使后者非常好,但你不需要带来额外的复杂功能。

您希望从imageSize指定的FILE中读取fd像素,而FILE最初位于栅格第一行的第一个字符处,这将解决问题:

for (pixel = 0; pixel < imageSize; pixel++) {
    int numScanned = fscanf(fd, "%d %d %d",
            &pixels[pixel][0],
            &pixels[pixel][1],
            &pixels[pixel][2]);
    if (numScanned < 3) {
        // ... handle file format or I/O error ...
        break;
    }
}