2017-02-22 41 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; 
    } 
}