hoge diary - July 17, 2007

[プログラミング] PGM ファイルの書き出し in Windows

Windows 上でプログラムを書いていて,24-bit 画像のピクセルデータを std::vector<BYTE> 上に保持し,それを PGM (P5; バイナリ形式) 形式で手っ取り早くファイルに書き出そうと思い,以下のコード片を書きました.

std::vector<BYTE> pixel_data;
...

std::ofstream out("temp.pgm");
out << "P5\n" << width << " " << height << "\n255\n";          // width と height はそれぞれ画像の幅と高さ
for (std::vector<BYTE>::iterator it = pixel_data.begin(); it != pixel_data.end(); ++it)
{
  char p = *it;
  out.write(&p, 1);
}

これが見事に大はまり.出力した PGM ファイルを IrfanView で見ると... 1 ピクセル横にずれるのです.原因がさっぱり分からず数時間たっぷり悩んでいました.

悩みながら,PGM (P5) の代わりに PPM (P6) で書き込むと,RGB の成分ずれが起こったので,今回の原因に気づきました.テキストモードで書き込んでいたため LF が CR+LF に変換されていたというわけです.

以下のように,バイナリモードでファイルを開いて書き込めば万事解決.

std::vector<BYTE> pixel_data;
...

std::ofstream out("temp.pgm", std::ios::binary);
out << "P5\n" << width << " " << height << "\n255\n";          // width と height はそれぞれ画像の幅と高さ
for (std::vector<BYTE>::iterator it = pixel_data.begin(); it != pixel_data.end(); ++it)
{
  char p = *it;
  out.write(&p, 1);
}

今まで散々 LF オンリーな環境でプログラムを書いていたので,全然気づきませんでした.あー,なんて凡ミスをしてるんだろ俺.

コメント

名前(何でも可):

テキスト(http:// を含む内容は投稿できません):

トラックバック

トラックバック URI: https://www.pakunet.jp/hoge/trackback/2007071702

トラックバックはありません.


Valid XHTML 1.1! Valid CSS!
© 2004-2009 ぱくちゃん.
Last modified: Thu Nov 01 01:17:21 JST 2007