JPEG 画像をマスクで Alph Blending する

VC++ で JPEG 画像を GIF で作成したマスク画像に従って Alph Blending して表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. my.lib に登録されている Object Class を使うので my.h をインクルードして my.lib をリンクします。
    Object Class のソースコードは Object Class Library から取得して下さい。
    *Jpeg は元の画像を格納する IMAGE Object Class の定義です。
    *Mask はマスク画像を格納する IMAGE Object Class の定義です。
    *Surface, *Alph は Alph Blending する SURFACE Object Class の定義です。
    File[] は元になる JPEG 画像ファイルの名前です。
    MFile[] は Alph Blending に使用するマスク画像の名前で、File[] と同じサイズの画像です。
        /******************************************************/
        /*★ GIF 画像を Alph Blending で表示する    前田 稔 ★*/
        /******************************************************/
        #include    <windows.h>
        #include    "My.h"
        #pragma     once
        #pragma     comment(lib,"my.lib")
        #define     SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
    
        HINSTANCE   g_hInst;
        HWND        g_hWnd;
        IMAGE       *Jpeg= NULL;            // JPEG Object Class
        IMAGE       *Mask= NULL;            // GIF Object Class
        SURFACE     *Surface;               // Surface Object Class
        SURFACE     *Alph;                  // Alph Mask 画像
    
        char        File[]= "c:\\data\\ffx2s.jpg";    // 480*240
        char        MFile[]= "c:\\data\\ffx2s_a.gif"; // Alph Blending のマスク
        
  2. マスクに使用する Gif の画像です。
    Jpeg では透明色が劣化するので Gif を使いました。
    サイズは元の Jpeg 画像に合わせて下さい。
    黒が透明になり、白がそのまま描画され、灰色が濃さによって背景とブレンドされます。
    またマスク画像に赤緑青の色を設定することによって、その色だけを描画するチャンネル機能を持たせています。
    このマスク(白/黒)を使った画像はページの下の画像を参照して下さい。

  3. CALLBACK 関数の WM_CREATE: では AppInit() 関数を呼ぶだけで、全ての処理は関数の中で行います。
            case WM_CREATE:
                AppInit(hWnd);
                break;
        
  4. WM_PAINT: で Jpeg 画像を Gif のマスクとブレンドして画像を描画します。
    Surface->Clear() で Surface->hBmpDC をクリアします。
    Surface->Alph() がマスクを使ってブレンドするメンバ関数です。
    Alph() 関数には「背景画像と元の画像とマスク画像」が格納されているポインタを渡します。
    ブレンドした画像を BitBlt() で描画します。
            case WM_PAINT:          // マスクで Alph Blending
                hdc = BeginPaint(hWnd,&ps);
                Surface->Clear((HBRUSH)GetStockObject(LTGRAY_BRUSH));
                Surface->Alph(Surface->Data,Alph->Data,Alph->WData);
                BitBlt(hdc,10,10,Jpeg->Width,Jpeg->Height,Surface->hBmpDC,0,0,SRCCOPY);
                EndPaint(hWnd,&ps);
                break;
        
  5. WM_CLOSE: では、終了前にリソースを開放して下さい。
            case WM_CLOSE:          // クローズ
                SAFE_DELETE(Jpeg);
                SAFE_DELETE(Mask);
                SAFE_DELETE(Surface);
                SAFE_DELETE(Alph);
                DestroyWindow(hWnd);
                break;
        
  6. Jpeg 画像と Gif のマスクを Surface(Alph) に格納する関数です。
    IMAGE Object Class を生成して画像を入力します。
    IMAGE Object Class を生成してマスク画像を入力します。
    画像をブレンドする Surface Object Class を作成します。
    元の Jpeg 画像と Mask にマスクに使う Gif 画像を Alph に転送します。
        void  AppInit(HWND hwnd)
        {   // 背景 JPEG 画像のロード
            Jpeg= new IMAGE(hwnd);
            Jpeg->LoadFile(File);
            // GIF のマスク画像をロード
            Mask= new IMAGE(hwnd);
            Mask->LoadFile(MFile);
            // 24bit DIB 作成
            Surface= new SURFACE(hwnd,Jpeg->Width,Jpeg->Height);
            Alph= new SURFACE(hwnd,Jpeg->Width,Jpeg->Height);
            // Alph に画像とマスクを転送
            Jpeg->Show(Alph->hBmpDC,0,0);
            Mask->Show(Alph->hWBmpDC,0,0);
        }
        
  7. WinMain() は何時もと同じように画像サイズに合わせてウインドウを表示するだけです。

【演習】

  1. プログラムを完成させて下さい。
  2. マスク画像を工夫して色々なパターンでブレンドしてみて下さい。
    マスク画像に赤緑青の色を設定して、色ごとのチャンネル機能を持たせることが出来ます。
    また RGB マスクを使ってブレンドする色調を設定することもできます。
    COLORREF Mask; //RGB マスク
  3. セピア色に設定して描画してみました。


    普通の白/黒のマスクを使った画像と比べてみて下さい。

超初心者のプログラム入門(Win32API C++)