[BMP]ビットマップの保存
ビットマップの保存
今回は簡単です。
DIBのビットマップを以下の順にファイルに書いてやればOK。
BITMAPFILEHEADER構造体
↓
BITMAPINFOHEADER構造体
↓
カラービットデータ
回転のコード に適当にボタンを追加して、ON_BN_CLICKED のハンドラを追加します。
void CSampleDlg::OnBnClickedButton1()
{
// ファイルを保存する形式のダイアログ
CFileDialog dlg(FALSE);
// BITMAPFILEHEADER作成
// BITMAPINFOHEADERを作成していない場合は作る。
// BITMAPINFOHEADER構造体についてはこちら
BITMAPFILEHEADER bfh = {0};
bfh.bfType = 0x4D42;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bfh.bfSize = bfh.bfOffBits + bih.biSizeImage;
// ダイアログ起動
if (dlg.DoModal() != IDOK) return;
// 保存先のファイルパス取得
CString filename = dlg.GetPathName();
// ファイルオープン
CFile file;
if (!(file.Open(filename, CFile::modeCreate | CFile::modeReadWrite))) return;
// 書き込み処理(一応例外をtry-catchする)
try
{
file.Write(&bfh, sizeof(BITMAPFILEHEADER));
file.Write(&bih, sizeof(BITMAPINFOHEADER));
file.Write(pDstData, m_DstBih.biSizeImage);
}
catch(CFileException *)
{
AfxMessageBox(_T("書き込み失敗"));
file.Close();
return;
}
file.Close();
}
135度回転した画像を保存した結果。
元画像が288*216ピクセル = 186,678 バイトであるのに対し、
回転後画像は356*356ピクセル = 380,262 バイト。
圧縮なしなので、計算どおりのサイズとなっています。
→ bfh.bfSize = bfh.bfOffbits + bih.biSizeImage