2017-02-22 3 views
0

ピクセルに対応する各行と、PPM P3イメージからのR G B値である各列を持つ行列を希望します。ピクセルデータをPPM(P3)イメージからCのマトリックスにどのように読み込むのですか?

[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関数によって読み込まれた行を参照します。

+0

あなたを決して:

が最初のラスタの最初の行の最初の文字に位置しているFILEで、あなたはfdによって指定されたFILEからimageSizeピクセルを読みたいということを考えると、これはトリックを行います'line'を更新すれば、同じ値をスキャンするだけです。 – jwodder

+0

おっと、私は更新線を行う外側whileループを見逃しました。 –

+0

r、g、bコンポーネントをイメージの異なる*行*に置くのは謎です。また、あなたが読んだすべての行に対して 'for(column = 0; column <(imageSize); column ++)'ループが遅くなる理由もあります。たとえそれが紙面上の非公式の擬似コードであっても、あなたが何をしたいのかという正確なフローチャートを書くことをお勧めします。 –

答えて

1

改訂されたコードでは、問題は明らかです。画像のすべてのピクセルをからそれぞれラスタラインに読み取ろうとしています。 fgets()が無期限にブロックされない限り、は永遠にで実行されませんが、ラスタのサイズが大きく、ファイルが多数のピクセル行で構成されている場合、非常に時間がかかることがあります。いずれにしても、最も外側のループの各繰り返し(すなわち、読み込まれた各行について)のために、前に割り当てられたすべてのピクセル値が上書きされます。です。

さらに、実際には間違っていなくても、最も内側のループは非常に難読化されています。常に正確に1回の反復を実行します。その反復変数rowは実際に(ラスタの行とは対照的に)ピクセルコンポーネントを索引付けし、いずれの場合もrowはすべての繰り返しで値0を持ちます。ただそれを取り除くほうがよいでしょう。

全体として、これは必要以上に困難になっています。 PPM P3形式は、はるかに簡単なコードで入力できるように設計されています。有効なPPM P3ファイルの各サンプルは前後に空白があることが保証されています。一方、フィールドの位置と幅、および行ごとの数は固定されていません。これらの特性を合わせると、fscanf()が実際にfgets() + sscanf()よりも良い選択である比較的まれなケースの1つになります。行の長さの制限は後者をかなり良くしますが、余分な複雑さは必要ありません。

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; 
    } 
} 
関連する問題