2017-02-22 123 views
0

我想要一个矩阵,每行对应一个像素,每列是来自PPM P3图像的R G B值。如何将PPM(P3)图像中的像素数据读入C中的Matrix?

我试图用[imageWidth * imageHeight] [3]创建一个Matrix,然后填充它的大小,但它似乎是永远占用的。我想我错过了一些东西,任何人都可以解释我出错的地方,或者建议一个更好的方法来做到这一点?

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函数读入的行。

+0

你永远不更新'行',所以你只是在重复扫描相同的值。 – jwodder

+0

哎呀,我错过了我的外线while循环,更新线。 –

+0

为什么要将r,g,b组件放在图像的不同*行*上,这是一个谜。为什么'for(column = 0; column <(imageSize); column ++)'为你读的每一行循环,这将会很慢。我建议你写一个你想要发生什么的流程图 - 即使这是纸上的非正式伪代码。 –

回答

1

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

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

总的来说,你做得比它需要的要困难得多。 PPM P3格式的设计方式使其可以通过更简单的代码进行输入。有效的PPM P3文件中的每个样本保证在前后有空白。另一方面,字段的位置和宽度以及它们每行的数量并不固定。总之,这些特征使得这种相对罕见的情况之一,其中fscanf()实际上是比fgets() + sscanf()更好的选择。线长限制使得后者非常好,但是你不需要带来额外的复杂性。

既然你想读通过fd指定的FILEimageSize像素,与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; 
    } 
}