OffscreenSurface に Jpeg Image をロードする

DirectX の CreateOffscreenPlainSurface で Surface を生成して、D3DXLoadSurfaceFromFile で画像をロードします。
DirectX の LPDIRECT3DDEVICE9->StretchRect で画像を描画します。

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

プログラムの説明

  1. プライベートライブラリを使わないで作成した JpgImage.cpp のソースコードです。
    Windows.h を省略すると d3dx9.h(DirectX9 の標準 Header File) から自動的に取り込んでくれます。
    必要なライブラリは #pragma でリンクしています。
    WINDWIDTH と WINDHEIGHT はイメージの幅と高さです。
    g_pSurface がイメージをロードする OffscreenSurface です。
        /*********************************************************/
        /*★ OffscreenSurface に Jpg Image をロード   前田 稔  ★*/
        /*********************************************************/
        #define     NAME    "Jpeg Image"
        //#include    <Windows.h>
        #include    <d3dx9.h>
        #define     SAFE_RELEASE(x) if(x){x->Release();x=NULL;} 
        #define     WINDWIDTH  280      //イメージの幅
        #define     WINDHEIGHT 170      //イメージの高さ
    
        #pragma once
        #pragma comment(lib,"dxerr9.lib")
        #pragma comment(lib,"dxguid.lib")
        #pragma comment(lib,"d3d9.lib")
        #pragma comment(lib,"d3dx9.lib")
    
        // Global Area
        HWND                g_hWnd;
        LPDIRECT3D9         g_pD3D = NULL;          // D3DDeviceを作成するために使用
        LPDIRECT3DDEVICE9   g_pDEV = NULL;          // 描写用デバイス
        LPDIRECT3DSURFACE9  g_pBackBuffer = NULL;   // バックバッファ用
        LPDIRECT3DSURFACE9  g_pSurface = NULL;      // 背景画像サーフェース用
        bool                g_bActive = false;      // アクティブ状態
        
  2. WinMain() 関数と CALLBACK 関数は、2Dグラフィックと同じなので説明の必要は無いでしょう。
    ウインドウサイズを画像に合わせて設定して下さい。
    ウインドウのサイズが画像より小さいと描画されないので注意して下さい。
    メッセージループに入る前に InitDevices() でデバイスの初期化を行って下さい。
  3. WinMain() から呼ばれる InitDevices() です。
    Init3DDev() で Direct3D Device を取得して、g_pD3D と g_pDEV を設定して下さい。
    Device が取得できたら、BackBuffer と同じ形式のオフスクリーンサーフェースを取得して画像をロードします。
        HRESULT InitDevices(void)
        {   HRESULT  hr;
    
            if (FAILED(Init3DDev()))    return E_FAIL;
            // バックバッファを取得
            if (FAILED(g_pDEV->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&g_pBackBuffer)))
            {   return FALSE;  }
            // バックバッファの状態を取得
            D3DSURFACE_DESC desc;
            g_pBackBuffer->GetDesc(&desc);
            // 画像ファイル用オフスクリーンサーフェースの作成
            if (FAILED(g_pDEV->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format,
                               D3DPOOL_DEFAULT, &g_pSurface, NULL )))
            {   return FALSE;  }
            //画像ファイルの読み込み
            hr= D3DXLoadSurfaceFromFile(g_pSurface,NULL,NULL,"ayu.jpg",NULL,D3DX_FILTER_NONE,0,NULL);
            if (FAILED(hr))
            {   MessageBox(NULL,"ayu.jpg","IMG File Open Error",MB_OK);
                return FALSE;
            }
            return  S_OK;
        }
        
  4. 画像を描画する関数です。
    画像の描画は StretchRect() を実行するだけです。
        VOID Render()
        {   RECT  SrcRect,DestRect;
    
            if (!g_bActive)     return;
            // バックバッファへ描画
            SetRect(&SrcRect,0,0,WINDWIDTH,WINDHEIGHT);
            SetRect(&DestRect,0,0,WINDWIDTH,WINDHEIGHT);
            g_pDEV->StretchRect(g_pSurface,&SrcRect,g_pBackBuffer,&DestRect,D3DTEXF_NONE);
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  5. プログラムの終了処理です。
    取得した Object を全て開放して下さい。
        VOID Cleanup()
        {   SAFE_RELEASE(g_pSurface);
            SAFE_RELEASE(g_pBackBuffer);
            SAFE_RELEASE(g_pDEV);
            SAFE_RELEASE(g_pD3D);
        }
        

【演習】

このままでは、ウインドウをドラッグするとアスペクト比が変わります。
case WM_SIZE: を記述して、拡大・縮小によるアスペクト比を保って下さい。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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

超初心者のプログラム入門(DirectX9 game program)

超初心者のプログラム入門(DirectX10 game program)