元の絵からマスクを作る

最終更新 2003 10/02

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

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

全ソースコード



CreateBitmap 関数
CreateCompatibleBitmap 関数
    
    対応しているバージョン
    95, 98, Me, NT3.1以降, CE1.0以降, 2000, XP
        
    使用するヘッダとライブラリ
    wingdi.h
    gdi32.lib
DirectDraw を使う場合は、透過色が指定できるのでマスク画像は必要ないのですが DirectDraw を使わない場合(ゲームでは使わない理由がないのですが・・・)には 背景の画像とキャラクターの画像を合成するために、マスク画像が必要です。 マスク画像は白と黒だけのモノクロビットマップです。 キャラクターを表示したい部分を黒で塗りつぶし、それ以外を全て白で塗り潰します。 元の絵 このような絵があったら マスク画像 これがマスク画像になります。 背景とキャラクターを合成させるには 元の絵の背景は黒 元の絵の背景を黒に変更します。 そのあと 背景とマスクをANDで合成 マスクを AND で貼り付け さらに元の絵をORで合成 元の絵を OR で貼り付ける このように 1.元の絵から白黒のマスク画像を作る 2.元の絵の背景を黒で塗りつぶす という作業が必要になります。 大抵の場合は、キャラクターの絵を描くついでにマスク画像も作ってしまうのですが キャラクターの絵を描く度に、いちいちマスク画像を作り直すのはとても面倒です。 ですので、プログラム実行時に自動的にマスク画像を作ってくれるような関数を こさえてしまえば良いという発想にたどり着きます。 マスク画像を作るときに必要な処理は 1.CreateCompatibleDC() 関数でメモリDCを取得 2.CreateBitmap() 関数でモノクロビットマップを作る 3.SelectObject() 関数でメモリDCにビットマップハンドルを対応させる 4.SetBkColor() 関数で背景色を設定する(この時、戻り値を変数に保存) 5.BitBlt() 関数で作成したモノクロビットマップに元の画像を貼り付ける 以上の5行程です。 CreateBitmap() 関数は白黒のモノクロビットマップを作ってくれます。 CreateBitmap() 関数でモノクロビットマップを作成したら、SetBkColor() 関数で 背景色を設定します。背景色に設定された色は、次の BitBlt() 関数で色つきの 画像をモノクロビットマップに貼り付ける時に白に変換されます。 背景色以外の色は黒に変換されます。 注意する点は、SetBkColor() 関数を実行する際に、元の背景色を保存しておかなければ いけません。で、必要がなくなった時点で、再び SetBkColor() 関数を実行して、保存 しておいた元の背景色に戻します。そうしないとリソースメモリがどんどん減って行き 最後には底をついてシステムがフリーズしてしまいます。 SetBkColor() 関数には、元の絵の透明にしたい色を指定します。 色は RGB() マクロで指定します。この辺のやりとりはサンプルを参考にして下さい。 マスク画像が完成したら、次は元の絵の背景色を黒で塗りつぶす必要があります。 これは元の絵のピクセルを1つずつ読み取って、背景色なら黒で塗る・・・という 作業を行うとおそろしく時間がかかってしまうので、もっと効率の良い方法で 処理します。 元の絵の背景を黒で塗りつぶすには 1.CreateCompatibleDC() 関数でメモリDCを取得 2.CreateCompatibleBitmap() 関数で元の画像と同じ色数のビットマップを作る 3.SelectObject() 関数でメモリDCにビットマップハンドルを対応させる 4.BitBlt() 関数で作成したビットマップにマスク画像の色を反転させて貼り付ける 5.元の絵に3.で作成したビットマップを AND で貼り付ける 以上の5行程です。 マスク画像の白と黒を逆にした色のビットマップを作り、そのビットマップを 元の絵にANDで合成すると、元の絵の背景色が黒になります。 最後に、変更した背景色を元に戻して、いらなくなったメモリDCと ビットマップハンドルを削除します。 ビットマップハンドルは DeleteObject() 関数で削除し、メモリDCは DeleteDC() 関数で削除します。 先に DeleteDC() でメモリDCを削除して、その後 DeleteObject() で ビットマップハンドルを削除します。 削除する順番は必ずこの通り行います。 背景色を元に戻すのと、ビットマップの削除を忘れるとリソースメモリが どんどん減ってしまうので、くれぐれも忘れないように。

| home |