メモリ上に空のビットマップを作る

最終更新 2003 10/01

サンプルのダウンロード → API_Bitmap5.lzh(158k)

サンプルプログラムのスクリーンショット

全ソースコード


    
CreateDIBSection 関数
BitBlt 関数
CreateCompatibleDC 関数
LoadImage 関数
SelectObject 関数
DeleteObject 関数
DeleteDC 関数
    
    対応しているバージョン
    95, 98, Me, NT4.0以降, CE1.0以降, 2000, XP
        
    使用するヘッダとライブラリ
    wingdi.h
    gdi32.lib
空のビットマップというのは、絵のデータがないビットマップです。 買ったばかりの真っ白な画用紙みたいなものですね。 空のビットマップは、メモリ上に読み込んだ他のビットマップを切り貼りして 合成する等の目的で使用します。 空のビットマップを作るのは、ビットマップをメモリに読み込む方法とは やり方が少し違います。 自分でビットマップを作るわけですから、ファイルのヘッダの部分なんかも 自分で作らないといけません。 ビットマップファイルは大きく分けると
1.ファイルヘッダ 2.カラーテーブル(パレットデータ) 3.ビットデータ(絵のデータ)
以上の3種類のデータから成り立っています。 2.のカラーテーブルは256色以下のビットマップにだけ存在します。 24ビットのビットマップにはカラーテーブルはありません。 24ビットのビットマップにはパレットがないからです。 3.のビットデータは絵のデータのことです。絵に使われている色の値が 順番に並んでいます。 1.のファイルヘッダには、ビットマップの細かい設定に関する情報が 書かれています。 ここのデータを読み取ることで、ビットマップは16色か、256色か 24ビットかビットマップのファイルサイズは何バイトか、絵の大きさは どのくらいか・・・などが分かります。 空のビットマップを作るには、1.の「ファイルヘッダ」の部分を自分で 設定して必要なサイズのメモリを確保します。 まず最初に CreateCompatibleDC 関数でメモリ用HDCを取得します。 ここはビットマップをメモリに読み込む方法と同じです。 次にビットマップハンドルを取得するわけですが、その前に BITMAPINFOHEADER 構造体の変数 ( bi ) を宣言して、メンバに必要な 値をセットします。 上のサンプルで値をセットしているメンバは
biSize biWidth biHeight biPlanes biBitCount biCompression
の6つです。 この中で特に意味のあるメンバは biWidth biHeight biBitCount です。 他のメンバはサンプル通りに設定しておけば良いと思います。 biWidth biHeight は名前から予想がつくと思いますが、作成したい ビットマップの横幅と高さを設定します。 biBitCount はモノクロビットマップなら1、16色なら4、256色なら 8、24ビットなら24を設定します。 他に16ビット、32ビットもありますが、操作が少し複雑に なるので、興味がある方は自分で調べて見て下さい。 空のビットマップを作る場合は24ビットで作成した方が楽です。 256色以下の場合は自分で論理パレットというものを作って メモリに読み込んだビットマップにそのパレットを割り当てないと いけません。 これがまたとても面倒で、特に何枚ものビットマップをメモリに読み込む 時は、それらのビットマップで使っているパレットの色をやりくりする だけで大変です。 256色でゲームを作る場合は、全ての画像で同じパレットを使うように すれば良いのですが・・・。 24ビットならパレットを作る必要がないですし、絵が綺麗に表示できます。 ただ、多少処理速度が遅くなるということですが、手間を取るか、見た目の 綺麗さをとるか、速度を取るかという感じでしょうか。 値を設定したら CreateDIBSection 関数を使ってビットマップハンドルを 取得します。 引数に (void **)(&pRGBT) という値を設定している個所がありますが これは深く考えない方が良いです。 こういう風に使うとだけ覚えておけば問題はないでしょう。 pRGBT はただ引数に指定しなければならないので宣言しただけです。 ですから、何か値を代入したりとかいう作業は全く行っていません。 ビットマップハンドルが取得できたら SelectObject() 関数でメモリ用の HDCに、先ほど取得したビットマップハンドルを選択して対応させます。 ここもビットマップの読み込みと同じです。

| next | back | home |