LoadImage 概略
 
 

■ LoadImage 概略

 LoadImage は EGLMediaLoader クラスを用いて画像を読み込み、これを描画するだけのきわめて基本的なサンプルプログラムです。
 メニュー「ファイル」の「開く」コマンドで背景画像を、「オブジェクト読み込み」で上に重ねて描画する画像を読み込んで表示させることが出来ます。読み込むことの出来る画像形式は、ERI、MEI、BMP、AVI、更に GDI+ がインストールされている環境では PNG や JPEG なども読み込むことが出来ます。
 ウィンドウ右端の垂直スクロールバーで描画する透明度、ウィンドウ下端の水平スクロールバーで描画する回転角度を操作することが出来ます。
 ここでは、EGLMediaLoader クラスを使った画像ファイルの読み込み機能と、画像を描画する機能の解説を行います。

 

■ EGLMediaLoader クラス

 EGLMediaLoader クラスは、静止画像、または動画像を読み込んで、メモリ上に画像を展開して保持します。
 EGLMediaLoader::LoadMeidaFile 関数を使うと ERI 形式(MEI 形式を含む)、BMP 形式、AVI 形式のほか、GDI+ がインストールされている環境では、PNG 形式や JPEG 形式などのファイルも読み込むことが出来ます。
 GDI+ は WindowsXP であればOSにプリインストールされていますが、Windows98、WindowsMe、Windows2000などでは、gdiplus.dll ファイルを実行可能形式と同じディレクトリにコピーすれば使うことが出来るようになります。
 GD+ のランタイムは、マイクロソフトから無料で配布されており(こちら)、また、アプリケーションに添付して配布しても良いようです(詳しくは GDI+ ランタイムに添付されているテキストファイルを読んでみてください)。

 EGLMediaLoader クラスを使って画像ファイルを読み込む手順は以下のようになります。

(1) EGLMediaLoader::Initialize 関数を呼び出す
(2) EGLMediaLoader::LoadMeidaFile 関数で画像を読み込む
(3) EGLMediaLoader::Close 関数を呼び出す
 (1)、(3) はアプリケーションの開始と終了のときに1度呼び出すだけでかまいません。
 LoadImage サンプルプログラムでは、CLoadImageApp クラスの構築関数内部で初期化関数を呼び出し、終了関数は明示的には呼び出していません。
 

■ 画像描画

 画像データをDC(デバイスコンテキスト)に描画するには EGLImage::DrawToDC 関数を呼び出します。
 これは、View クラスの CLoadImageView::OnDraw 関数から呼び出しています。

 LoadImage サンプルプログラムでは、更に画像を重ねて描画させることが出来ます。
 画像の描画は EGL_DRAW_IMAGE オブジェクトを使って行います。
 CLoadImageView::RedrawImage 関数を参照してください。

    //
    // ベース画像を複製
    //
    HEGL_DRAW_IMAGE hDrawImage = ::eglCreateDrawImage( ) ;
    hDrawImage->Initialize( m_imgScreen, NULL, NULL ) ;
    //
    EGL_DRAW_PARAM  egldp ;
    ::eslFillMemory( &egldp, 0, sizeof(egldp) ) ;
    egldp.pSrcImage = pDoc->m_imgBase ;
    if ( !hDrawImage->PrepareDraw( &egldp ) )
    {
        hDrawImage->DrawImage( ) ;
    }
    //
    // オブジェクト画像を描画
    //
    if ( pDoc->m_imgObj.GetInfo() != NULL )
    {
        EGL_IMAGE_AXES  egliax ;
        EGL_POINT   ptRevCenter ;
        egldp.dwFlags = EGL_DRAW_BLEND_ALPHA ;
        egldp.pSrcImage = pDoc->m_imgObj ;
        ptRevCenter.x = egldp.pSrcImage->dwImageWidth / 2 ;
        ptRevCenter.y = egldp.pSrcImage->dwImageHeight / 2 ;
        egldp.ptBasePos.x = m_ptCenter.x ;
        egldp.ptBasePos.y = m_ptCenter.y ;
        if ( !::eglGetRevolvedAxes
            ( &egliax, &egldp.ptBasePos,
                &ptRevCenter, 1, 1, (REAL32) m_nRev ) )
        {
            if ( (m_imgScreen.GetInfo()->dwBitsPerPixel == 32)
                    && (egldp.pSrcImage->dwBitsPerPixel == 32) )
            {
                egldp.pImageAxes = &egliax ;
            }
            if ( egldp.pSrcImage->fdwFormatType & EIF_GRAY_BITMAP )
            {
                egldp.dwFlags = EGL_DRAW_GLOW_LIGHT ;
                egldp.rgbDimColor.dwPixelCode = 0xFFFFFFFF ;
                egldp.rgbLightColor.dwPixelCode = 0 ;
            }
            egldp.nTransparency = m_nTrans ;
            if ( !hDrawImage->PrepareDraw( &egldp ) )
            {
                hDrawImage->DrawImage( ) ;
            }
        }
    }
    //
    hDrawImage->Release( ) ;

 EGL_DRAW_IMAGE オブジェクトを使った画像の描画は以下のような手順になります。

(1) eglCreateDrawImage 関数を呼び出して描画オブジェクトを作成する
(2) Initialize 関数で描画オブジェクトを初期設定する
(3) PrepareDraw 関数で描画パラメータを設定する
(4) DrawImage 関数で描画する
(5) 描画オブジェクトを使い終わったら Release 関数で解放する
 各関数の詳細な解説や、描画可能なフォーマットの組み合わせについてはEGLリファレンスマニュアル(EGL-ref.doc)を参照してください。
 ここでは、描画パラメータをセットアップする関数について、補足説明します。
 回転角度や拡大率を入力して、実際の描画関数に渡すパラメータに変換するには、eglGetRevolvedAxes 関数を呼び出します。

 PrepareDraw 関数に渡す画像描画パラメータは、以下に示すように、描画開始座標(入力画像の左上座標に対応)とx、y軸のベクトルです。
 

 
 一方、eglGetRevolvedAxes 関数に渡すパラメータは以下のような意味を持っており、このパラメータを変換します。

 eglGetRevolveAxes 関数では、描画先の画像座標上での入力画像の回転の中心座標に対応する座標(中央の左向き矢印の指し示している座標)と、入力画像の座標系での回転の中心座標、更に拡大率、回転角度などを指定すると、対応する描画イメージ上の画像の左上座標とx、y軸のベクトルを取得することが出来ます。