您如何将PPM(P3)图像的像素数据读取到C中的矩阵中



我想要一个矩阵,每行对应于一个像素,每个列是来自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;
     }
  }
}

行是指fgets函数读取的行。

在修订的代码中,问题很清楚:您尝试从射手行读取图像的所有像素。除非fgets()无限期阻止,否则这不会运行 forever ,但是如果栅格尺寸较大并且文件用许多像素线组织,则可能需要很长时间。无论如何,它是错误,对于最外层循环的每次迭代 - 也就是说,对于每行读取 - 它覆盖所有先前分配的像素值。p>此外,您的最内向循环虽然并没有错,但具有很高的混乱性。它总是执行一个迭代;它的迭代变量row实际上索引像素组件(而不是栅格的行),并且row无论如何都具有每个迭代的值0。最好将其删除。

总的来说,您的困难要比需要。PPM P3格式的设计方式使其可以通过更简单的代码进行输入。有效的PPM P3文件中的每个样本都可以在之前和之后具有空格。另一方面,磁场的位置和宽度和每行的数量未固定。总之,这些特征使fscanf()实际上是比fgets() sscanf()更好的选择。线长度的限制也使后者也不错,但是您不需要带来的额外复杂性。

鉴于您想从fd指定的FILE读取imageSize像素,而该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;
    }
}

相关内容

  • 没有找到相关文章

最新更新