モノクロビットマップを作る

今回は、いよいよビットマップオブジェクトを扱います。
ということで、モノクロビットマップを作ってみましょう。

ビットマップ

ファイルの種類にもビットマップというものがありますが、あれと同じで
ビットマップとは、1ピクセルごとの色情報のデータの集まりです。
ビットマップオブジェクトは、そのままでは描画には使えず
メモリデバイスコンテキストやブラシパターンとして描画することになります。

1ピクセルあたりの情報量をビットマップごとに見ると

モノクロビットマップ:1bit
16色ビットマップ:4bit
256色ビットマップ:8bit(=1byte)
HighColor(16ビット)ビットマップ:16bit(=2byte)
TrueColor(24ビット)ビットマップ:24bit(=3byte)
TrueColor(32ビット)ビットマップ:32bit(=4byte)

となります。これで計算すると、640x480の24ビットマップだと
データ量は640*480*3byte=921,600byteになりますね。
(あとは、これに大きさや色数などのヘッダがつくことになります)

ところで今回作るモノクロビットマップでは、1ピクセルは
1ビットで表現されることになりますが、変数は1バイト単位なので
1ビットを扱うとなると、どうなんだ?という感じになります。
ここで使うのがバイト型(Byte)の変数で、バイト型の変数は
符号なしの8ビット(1バイト)の数値として格納され、0~255の範囲の値をとります。
これはモノクロビットマップを表現するのに適しているので、このByte型を使います。
Byte型のデータ1つで、8*1ピクセル分のビットマップのデータになります。

※データのパターンは2進数で考える(0=黒・1=白)
00000000=8ビットすべて黒パターン・01010101=黒白パターン
10101010=白黒パターン・11111111=8ビットすべて白パターンetc

モノクロビットマップ

作成したモノクロビットマップを表示してみましょう。
「多重起動の防止」のソースをスケルトンとして使います。
ウィンドウプロシージャ内に以下の内容を追加していきましょう。

     //デバイスコンテキスト・仮想DC
     HDC hdc, hdcMem;
     PAINTSTRUCT paint ;
     //作成するビットマップ
     HBITMAP hBitmap;
     //ビットマップデータ
     BYTE bm[]={1,128, 2,64, 4,32, 8,16,
                        16,8, 32,4, 64,2, 128,1,
                        128,1, 64,2, 32,4, 16,8,
                        8,16, 4,32, 2,64, 1,128};

hdcMem は、メモリデバイスコンテキストを作成する時
そのハンドルを格納します。
hBitmap はビットマップのハンドルを格納します。
bm[] は、作成するビットマップ用のデータです。

               //デバイスコンテキストを取得
               hdc = BeginPaint(hwnd, &paint);

               //ビットマップを作成
               hBitmap = CreateBitmap(16,16,1,1,bm);
               //仮想デバイスコンテキストを作成
               hdcMem = CreateCompatibleDC(NULL);
               //仮想デバイスコンテキストにビットマップを設定
               SelectObject(hdcMem, hBitmap);

               //仮想DCからDCへコピー
               BitBlt(hdc,0,0,16,16,hdcMem,0,0,SRCCOPY);
               //仮想デバイスコンテキストを削除
               DeleteDC(hdcMem);
               //ビットマップを削除
               DeleteObject(hBitmap);

               //デバイスコンテキストを解放
               EndPaint(hwnd, &paint);

CreateBitmap関数で16x16のモノクロビットマップを作成します。
また、CreateCompatibleDC関数でメモリデバイスコンテキスト(以下メモリDC)を作成します。
作成したビットマップを、SelectObjectでメモリDCに設定します。

デバイスコンテキストの内容をコピーするBitBlt関数で
メモリDCの(0,0)から幅・高さ16の大きさの長方形を
デバイスコンテキストの(0,0)にコピーします。

描画した後は、DeleteDC関数で作成したメモリDCを削除し、
その後DeleteObjectで作成したビットマップも削除します。
では実行してみましょう。

16x16のモノクロビットマップです

ひし形のモノクロビットマップが表示されています。

HBITMAP CreateBitmap(int nWidth,int nHeight, UINT cPlanes,
                UINT cBitsPerPel, CONST VOID *lpvBits );

第一引数 nWidth には、ビットマップの幅をピクセル単位で指定します
第二引数 nHeight には、ビットマップの高さをピクセル単位で指定します
第三引数 cPlanes には、デバイスが使っているカラープレーンの数を指定します
第四引数 cBitsPerPel には、1 ピクセルの色を識別するのに必要なビット数を指定します
第五引数 *lpvBits には、色データからなる配列へのポインタを指定します

戻り値 成功ならビットマップのハンドルが、失敗ならNULLが返ります。

ソースの表示

2005/6/2


戻る