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