1

PPM ファイルからピクセル データを読み込もうとしています。ヘッダーを読み取る関数があるので、ヘッダーがピクセル データの先頭を指していることがわかります。fgetc(file) を使用してみましたが、値が 1 桁以上の場合は機能しません。また、配列を使用して配列を int または char に変換しようとしましたが、各値の桁数を知る方法がありません。また、値が空白で区切られているかどうかもわかりません。基本的に、ピクセルデータを抽出する方法が必要です。(私はCを使用しています。)

現在の私のコードは次のとおりです。

char read_byte(FILE *ipt) {
    int c, i=0, sum=0;
    while (i<16) {
        c=fgetc(ipt);
        if((i%2)!=0 {
            if(c&1) {
                sum+=pow(2,i/2);
            }
        }
        i++;
    }
    return (char)sum;
}

編集:最初はファイルがASCII値として保存されていると思っていましたが、バイナリとして保存されていることに気付きました。今、私はそれを六角形のように振る舞わせていると思います。それが正しいかどうかはわかりません。私は本当に立ち往生しています。

編集:私のコードを少し変更しました

char read_byte(FILE *ipt) {
    int c, i=0, sum=0;
    while(i<8) {
        c = fgetc(ipt);
        c=c&1;
        sum+=c*pow(2,i);
        i++;
    }
    return sum;
}

合計を %c として出力します

4

1 に答える 1

2

課題のためにこれを書かなければなりませんか、それとも楽しみのためですか、それとも他の人のコードを使用できますか?

オープンソースのソリューションがあります。「Netpbm は、グラフィック プログラムとプログラミング ライブラリのパッケージです。」には、http://netpbm.sourceforge.net/doc/で PPM を読み取るプログラムが含まれています。

編集: http://netpbm.sourceforge.net/doc/ppm.htmlなどのファイル形式の定義を取得または読みましたか?

データは、1 バイトの RGB トリプルのシーケンス、または 2 バイトの RGB トリプルのシーケンスのいずれかのようです。

プログラムは、項目 7「色の最大値 (Maxval)」から、どの形式が使用されているかを検出できます。「Maxval が 256 未満の場合は 1 バイト、それ以外の場合は 2 バイト」と表示されます。

したがって、1 バイト/コンポーネント RGB データを読み取る関数をコーディングしてから、2 バイト/コンポーネント RGB データを読み取る別の関数をコーディングします。

プログラムは、Maxval の値を読み取った後、どちらを呼び出すかを選択できます。

編集 {

そのリンクのドキュメントによると、「P6」ppm の画像データはバイナリです。

したがって、MaxValue が <256 で、各色成分のデータが 1 バイトである場合、fgetc(fp) を 3 回呼び出して 3 バイトを読み取ると、1 つの RGB ピクセルのバイナリ値が返されます。

プログラムがヘッダーを読み取った場合、画像データの幅と高さの値が含まれています。そのため、すべての行 (RGB ピクセルの幅) に配列を割り当て、割り当てられた各ピクセル行配列へのポインターの配列を割り当てることができます。次に、バイナリ データを各行に読み込むと、プログラムは簡単に操作できます。2次元配列。

編集を終了

あなたの質問を読んだところ、fgetc を使用して 1 バイト データを読み取る方法を既に知っていることがわかりました。

編集 - これは無関係のようです: fgetc を 2 回呼び出すことで 2 バイトのデータを読み取ることができます。たとえば、(エラー チェックを部分的に無視して) データをシフトおよびビット論理和します。

int a = fgetc(fp);
int b = fgetc(fp);
if (a >= 0 && b >= 0) { // then all is okay
    unsigned int twobyte = (a<<8) | b; // or (b<<8) | a; depending on byte order
// ...
于 2012-03-18T00:37:53.927 に答える