[BMP]ビットマップの作成 | Assertion Failed!

[BMP]ビットマップの作成

ビットマップを作って表示してみる。


あくまで個人的な動作の確認のためなので、コードは適当。


[作成環境]

・Visual Studi 2008 Standart Edition

・MFC-ダイアログベース


ダイアログクラスに以下のメンバを追加


private:

  CBitmap m_bmp; // ビットマップオブジェクト


OnInitDialog()


// TODO: 初期化をここに追加します。


// ビットマップデータ部分を作成(高さ200px、幅300px)

BYTE *pData = new BYTE[200*300*4];


// データ部分の初期化

for(int i = 0; i < 200*300*4; i += 4)

{

  pdata[i]  = 0x00; // 青成分

  pdata[i+1] = 0x00; // 緑成分

  pdata[i+2] = 0xFF; // 赤成分

  pdata[i+3] = 0x00; // 未使用(予約領域)

}


// ビットマップの作成

m_bmp.CreateCompatibleBitmap(GetDC(), 300, 200);


// 作成したビットマップに、作成したデータ部分をセット

m_bmp.SetBitmapBits(200*300*4, pData);


delete [] pData;


OnPaint()


if(IsIconic())

{

  ・・・中略

}

else

{

  CDialog::OnPaint();


  // DC、メモリDC作成

  CDC *pDC = GetDC();

  CDC dcMem;

  dcMem.CreateCompatibleDC(pDC);

  

  // 作成したビットマップオブジェクト選択

  CBitmap *old;

  old = dcMem.SelectObject(&m_bmp);

  

  // メモリDC→DCへデータコピー(描画)

  pDC->BitBlt(0,0,200,300,&dcMem,0,0,SRCCOPY);


  // 元のビットマップオブジェクトに戻す

  dcMem.SelectObject(old);

  

  // 解放

  dcMem.DeleteDC();

  ReleaseDC(pDC);

}


上記コードで、ダイアログ上に赤で塗りつぶされた高さ300、幅200

のビットマップデータが表示される。

そのうちちゃんと記事にしたいけど、簡単に。。


ビットマップはBITMAPFILEHEADERBITMAPINFOHEADERというヘッダ情報と

その後に続くデータ(ピクセル単位の色の情報)をもっている。


データ部は、初期化している部分を見れば多少わかると思うが、

RGB成分のBYTEデータ列で構成されている。

RGBQUAD構造体というらしく、未使用領域含め4byte。

 この未使用領域は4byteアライメントのために用いられるのかと)


なので、ビットマップのデータとして、、

 (高さ)×(幅)×(色情報)

が必要となるので、領域確保の際 200*300*4 としている。


確保した領域は、1次元配列となっているが、CreateCompatibleBitmap

で指定した幅と高さにあわせて描画の際にラインが整えられるもよう。


また、いろいろなサイトで調べたところ、ビットマップの原点は

画像左下のようだが、自分の環境では左上が原点となっていた。


何故かは調べていない。