[プログラミング] 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 オンリーな環境でプログラムを書いていたので,全然気づきませんでした.あー,なんて凡ミスをしてるんだろ俺.
トラックバック
トラックバック URI: https://www.pakunet.jp/hoge/trackback/2007071702
トラックバックはありません.