1

私はファイリングに不慣れで、それについてあまり考えていません。

という名前の ASCII .pgm ファイルを読み取ろうとし、owl.pgmそれをmyowl.pgmファイルとして書き込むコードを作成しました。

#include <fstream>
const int MAXHEIGHT=221;
unsigned char *bitmap[MAXHEIGHT]={'\0'} ;// pointers to each pixel row
int main()
{
    int width=201, height=221;
    std::ifstream ifile("owl.pgm",std::ios::in);
    std::ofstream ofile("myowl.pgm",std::ios::out);
    for(int i=0;i<height;++i)
    {
        for(int j=0;j<width;++j)
            ifile.read(bitmap[i][j],sizeof(bitmap));
    }
    ofile << "P2\n" << width << " " << height << "\n255\n";
    for(int i=0;i<height;++i)
    {
        for(int j=0;j<width;++j)
            ofile<<bitmap[i][j];
    }
}

私のコードでは、いくつかのエラーがあります。誰かがそれを修正するのを手伝ってくれたら、私は感謝します。

4

1 に答える 1

2

問題は、入力ファイルからピクセルを読み取る方法にあるようです:

std::ifstream ifile("owl.pgm",std::ios::in);
for(int i=0;i<height;++i)
{
    for(int j=0;j<width;++j)
        ifile.read(bitmap[i][j],sizeof(bitmap));
}

問題 1 : プログラムがこのファイルのヘッダーを画像の実際のピクセルとして扱わないようにする必要があります。PGMのヘッダー形式を参照してください。ほとんどの場合、ピクセルを読み取る前に最初の 3 行をスキップする必要があります。

問題 2 : ビットマップ全体を一度に読み取ろうとしていますが、明らかにビットマップをピクセル単位で読み取ることを意図したネストされたループ内で実行しています。

代わりに、ピクセルの読み取りは次のようになります。

for(int i = 0; i < height; ++i)
{
    for(int j = 0; j < width; ++j)
        ifile >> bitmap[i][j];
}
于 2013-02-24T18:24:55.640 に答える