1

画像のヘッダー ファイルは正常に読み取ることができますが、赤チャネルの最初のデータ値 (206 など) を 2D 配列に入れるのに問題がありますppmImage.red[0][0]。空白が続き、その後に緑のチャンネルの最初の値が続きます。

以下は私が現在行っていることであり、206 が にある代わりに、ppmImage.red[0][0]= ppmImage.red[0][0]2、ppmImage.green[0][0]=0、およびppmImage.blue[0][0]=6 があります。参考までに、これらは 8 ビット値のみであるため、赤、緑、青はピクセル タイプであり、unsigned char.

void readTextData(fstream &fin, struct ppmImage &image)
{
int iii, jjj;

for(iii = 0; iii < image.rows ; iii++)
{
    for(jjj = 0; jjj < image.cols; jjj++)
    {
        fin >> image.red[iii][jjj];     
        fin >> image.green[iii][jjj];
        fin >>image.blue[iii][jjj]; 
    }
}

fin.close();
}

fin >>空白にぶつかるまで読むと思っていたのですが、間違っていました。私も使用してみfin.read((char *) & image.redgray[iii][jjj],sizeof(pixel));ましたが、結果は同じでした。

データは次のような形式になります。

1 2
3 4 5
6 7 8 9

そして、「\ n」をどのように処理するかわかりません。

私は情報を検索しましたが、今まで以上に混乱してしまいます。正しい方向への微調整や、私の愚かさを指摘してくれる人に感謝します。前もって感謝します。

4

2 に答える 2

0

これは単純な修正のように思えます。unsigned char ではなく整数を読み取る必要があります。画像は unsigned char を使用しているため、追加する必要があるのは、読み取り用の一時的な int だけです。

    int red, green, blue;
    fin >> red >> green >> blue; 
    image.red[iii][jjj] = red;
    image.green[iii][jjj] = green;
    image.blue[iii][jjj] = blue; 

あなたの画像ファイルはテキストファイルであると想定していますが、あなたの説明からそう思われます。

于 2013-10-08T04:08:11.050 に答える
0

可能であれば、配列を含む構造体から構造体の配列に変更します。

struct pixel { 
    unsigned char red, green, blue;

    friend std::istream &operator>>(std::istream &is, pixel &p) { 
        unsigned int red, green, blue;
        is >> red >> green >> blue;
        p.red = red;
        p.green = green;
        p.blue = blue;
        return is;
    }
};

// ...

for (i = 0; i<image.cols; i++)
    for (j=0; j<image.rows; j++)
        if (!infile >> pixels[i][j])
            break; // read failed
于 2013-10-08T04:12:12.997 に答える