ファイルの種類にもビットマップというものがありますが、あれと同じで
ビットマップとは、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で作成したビットマップも削除します。
では実行してみましょう。
ひし形のモノクロビットマップが表示されています。
HBITMAP CreateBitmap(int nWidth,int nHeight, UINT cPlanes,
UINT cBitsPerPel, CONST VOID *lpvBits );
第一引数 nWidth には、ビットマップの幅をピクセル単位で指定します
第二引数 nHeight には、ビットマップの高さをピクセル単位で指定します
第三引数 cPlanes には、デバイスが使っているカラープレーンの数を指定します
第四引数 cBitsPerPel には、1 ピクセルの色を識別するのに必要なビット数を指定します
第五引数 *lpvBits には、色データからなる配列へのポインタを指定します
戻り値 成功ならビットマップのハンドルが、失敗ならNULLが返ります。
■ソースの表示■
2005/6/2