DX2D Load

DX2D Load Bitmap

IMAGE をロードする LoadBitmapFile() 関数を作成します。

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

プロジェクトの作成

  1. IMAGE(画像ファイル)の描画には、かなり面倒な手順が必要です。
    そこで画像を入力して描画の準備を整える処理を一個の関数にまとめてみました。
    この関数を呼び出せば、後は Render() 関数で描画するだけです。
    Auto2D IMAGE などでは ID2D1Effect を使っているのですが、 Effect する必要が無いなら ID2D1Bitmap1 がお勧めです。
    今回は ID2D1Bitmap1 を使ってシンプルにまとめてみました。
  2. 画像ファイルを入力して、描画の準備を整える LoadBitmapFile() 関数です。
    パラメータとして ID2D1DeviceContext と IWICImagingFactory2 と PCWSTR uri を受け取ります。
    関数を呼ぶと ID2D1Bitmap1 がリターンされます。
    あとは、これを使って描画するだけです。
    ソースコードの説明は基本的に Auto2D IMAGE と同じなのでこちらを参照して下さい。
    Microsoft::WRL::ComPtr<ID2D1Bitmap1> Main::LoadBitmapFile(
        Microsoft::WRL::ComPtr<ID2D1DeviceContext>  d2dContext,
        Microsoft::WRL::ComPtr<IWICImagingFactory2> wicFactory,
        PCWSTR          uri
        )
    {
        Microsoft::WRL::ComPtr<ID2D1Bitmap1>    bitmapPerspective;
    
        ComPtr<IWICBitmapDecoder> decoder;
        DX::ThrowIfFailed(
            wicFactory->CreateDecoderFromFilename(
                uri,
                nullptr,
                GENERIC_READ,
                WICDecodeMetadataCacheOnDemand,
                &decoder
                )
            );
    
        ComPtr<IWICBitmapFrameDecode> frame;
        DX::ThrowIfFailed(
            decoder->GetFrame(0, &frame)
            );
    
        ComPtr<IWICFormatConverter> converter;
        DX::ThrowIfFailed(
            wicFactory->CreateFormatConverter(&converter)
            );
    
        DX::ThrowIfFailed(
            converter->Initialize(
                frame.Get(),
                GUID_WICPixelFormat32bppPBGRA,
                WICBitmapDitherTypeNone,
                nullptr,
                0.0f,
                WICBitmapPaletteTypeCustom
                )
            );
    
        DX::ThrowIfFailed(
            d2dContext->CreateBitmapFromWicBitmap(
                converter.Get(),
                nullptr,
                &bitmapPerspective
                )
            );
    
        return bitmapPerspective;
    }
    
  3. それでは LoadBitmapFile() 関数を組み込んでプログラムを作成します。
    DX2D App からプロジェクトをダウンロードして準備して下さい。
    Main.h にプロトタイプ宣言と領域の定義を追加して下さい。
        // 赤色のブラシ
        //Microsoft::WRL::ComPtr<ID2D1SolidColorBrush>    m_redBrush;
        Microsoft::WRL::ComPtr<ID2D1Bitmap1>              m_bitmapPerspective;
        Microsoft::WRL::ComPtr<ID2D1Bitmap1> LoadBitmapFile(
            Microsoft::WRL::ComPtr<ID2D1DeviceContext>  d2dContext,
            Microsoft::WRL::ComPtr<IWICImagingFactory2> wicFactory,
            PCWSTR          uri
            );
    
  4. Main.cpp の修正です。
    特に場所は問わないので、適当なところに LoadBitmapFile() 関数を挿入して下さい。
        ・・・
    
    ☆LoadBitmapFile() 関数を挿入します
    
        ・・・  
    
  5. CreateDeviceIndependentResources() では何も行いません。
    CreateDeviceResources() から LoadBitmapFile() を呼び出します。
    m_d2dContext, m_wicFactory は DirectXBase で定義されています。
    L"ayu.jpg", L"girl.gif" などの画像ファイルは、フォルダに格納してプロジェクトに加えて下さい。
    void Main::CreateDeviceIndependentResources()
    {
        DirectXBase::CreateDeviceIndependentResources();
    }
    
    void Main::CreateDeviceResources()
    {
        DirectXBase::CreateDeviceResources();
        //m_bitmapPerspective = LoadBitmapFile(m_d2dContext, m_wicFactory, L"girl.gif");
        m_bitmapPerspective = LoadBitmapFile(m_d2dContext, m_wicFactory, L"ayu.jpg");
    }
    
  6. Render() 関数で画像を描画します。
    void Main::Render()
    {
        m_d2dContext->BeginDraw();
    
        m_d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));
    
        m_d2dContext->DrawBitmap(m_bitmapPerspective.Get());
    
        HRESULT hr = m_d2dContext->EndDraw();
        if (hr != D2DERR_RECREATE_TARGET)
        {
            DX::ThrowIfFailed(hr);
        }
    
        Present();
    }
    
  7. 受け取り側(表示画面)の矩形領域を設定すると、矩形に合わせて画像が伸縮されます。
    テストに使った画像(ayu.jpg)は、280*170 の大きさです。
        m_d2dContext->DrawBitmap(m_bitmapPerspective.Get());
        D2D1_RECT_F destRect = D2D1::RectF(100.0f, 300.0f, 380.0f, 470.0f);
        m_d2dContext->DrawBitmap(m_bitmapPerspective.Get(),destRect);
        D2D1_RECT_F destRect2 = D2D1::RectF(500.0f, 300.0f, 800.0f, 600.0f);
        m_d2dContext->DrawBitmap(m_bitmapPerspective.Get(),destRect2);
    

超初心者のプログラム入門(DirectX Store)