我想要一个矩阵,每行对应一个像素,每列是来自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函数读入的行。
答案 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;
}
}