簡體   English   中英

您如何將像素數據從PPM(P3)圖像讀取到C語言的矩陣中?

[英]How do you read pixel data from a PPM (P3) image into a Matrix in C?

我想要一個矩陣,每一行對應一個像素,每一列都是PPM P3圖像中的RGB值。

我嘗試創建一個[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函數讀取的行。

在修改后的代碼中,問題很明顯:您嘗試從每個光柵行讀取圖像的所有像素。 除非無限期地阻止fgets() ,否則它將不會永遠運行,但是如果柵格尺寸很大並且文件由多行像素組成,則可能會花費很長時間。 無論如何,這是錯誤的 ,因為在最外層循環的每次迭代(即,對於每條讀取的行),它都會覆蓋所有先前分配的像素值。

此外,您的最內層循環雖然實際上並沒有錯,但卻十分混淆。 它總是執行一次精確的迭代。 它的迭代變量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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM