2017-03-01 8 views
0

私は、ppmイメージを読み込んでオブジェクトとして保存し、再度書き出すプログラムを作成しようとしています。理想的には、ピクセルをint型オブジェクトとして格納したいと思いますが、char型の類似したイメージしか取得できません。残念なことにcharオブジェクトを使用しても、グレーアウトされたバージョンのイメージになります。私は、なぜストレージの種類を変更すると、そのような大きな変化が起こっているのか、またはシェイプが保持されているときに画像の色が失われる理由についてはわかりません。C++の読み込み/書き込みPPMイメージファイルのグレー表示画像

ここでは他のppmプログラムの質問を見てみましたが、答えの頭や尾を作ることはできません。私はこの言語にはあまり慣れておらず、何が起こっているのか分かりません。

誰かが私が何をやっているのかを説明でき、charの代わりにint形式でデータを格納するために使用する戦略があれば、私は非常に感謝しています。

以下は、私のppmクラスのファイル読み取りとファイル書き込みコードです。私のmain関数はppmオブジェクトを初期化し、readfile()を呼び出し、writefile()を呼び出します。その中のどこかにイメージを保存できません。

void PPM::readFile(std::string filename) 
{ 
    std::ifstream file; 
    std::string stuff; 
    char junk; 
    file.open(filename, std::ios::binary); 
    file >> stuff >> width >> height >> maxCol; 
    file >> std::noskipws >> junk; 
    int i = 0; 
    char r, g, b; 
    std::cout << width*height; 
    while (i < width*height) 
    { 
     file.read(&r, 1); 
     file.read(&g, 1); 
     file.read(&b, 1); 
     red.push_back(b); 
     grn.push_back(b); 
     blu.push_back(b); 
     i++; 
     std::cout << i << std::endl; 
    } 
} 

void PPM::writeFile(std::string filename) const 
{ 
    std::ofstream file; 
    file.open(filename, std::ios::binary); 
    file << "P6 " << width << " " << height << " " << maxCol << std::endl; 
    int i = 0; 
    std::cout << width << " " << height; 
    while (i < width*height) 
    { 
     file.write(&red[i], sizeof(red[i])); 
     file.write(&grn[i], sizeof(grn[i])); 
     file.write(&blu[i], sizeof(blu[i])); 
     std::cout << "iteration " << i << std::endl; 
     i++; 
    } 
} 

おかげで再び任意の助けのためにあなたは、これはバグです

+0

「赤」、「緑」、「青」とは何ですか? –

答えて

1
red.push_back(b); 
grn.push_back(b); 
blu.push_back(b); 

与えることができます。 r、g、bをそれぞれ押し戻す必要があります。 charをintに変更すると、以下のコメントで指摘されているように、より安全です。

+1

もう一つのバグは、彼がmaxColをチェックしていないことです。 [PPM spec](http://netpbm.sourceforge.net/doc/ppm.html)によると、maxCol> 255の場合、カラーチャネルごとに2バイトがあります。だからこの場合、r、g、bは 'uint16_t'型でなければなりません。 – zett42

+0

このプログラムでは、カラーチャンネルが255以下に設定されていると想定しているため、実際にはカラーチャンネルを強制するための保護手段はありません。私はおそらくそれらを後で追加して、unit16_tタイプについて教えてくれてありがとう! – Forstrei

関連する問題