[BMP]ビットマップの保存 | Assertion Failed!

[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();

}



Assertion Failed!-ビットマップ保存

135度回転した画像を保存した結果。


元画像が288*216ピクセル = 186,678 バイトであるのに対し、

回転後画像は356*356ピクセル = 380,262 バイト。


圧縮なしなので、計算どおりのサイズとなっています。


→ bfh.bfSize = bfh.bfOffbits + bih.biSizeImage