DX2D Image Load

DirectX2D Image Load

DirectX2D(8.1)で LoadImageFile() 関数を作成します。

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

プロジェクトの作成

  1. IMAGE Control を使った描画 DirectX(8.1) 2DImage は簡単ですが、直接 Form に描画するには、かなり面倒な手順が必要です。
    そこで画像を入力して描画の準備を整える処理を一個の関数にまとめてみました。
    この関数を呼び出せば、後は Render() 関数で描画するだけです。
    画像ファイルをロードして、描画の準備を整えるには ID2D1DeviceContext1 と IWICImagingFactory2 が必要です。
    Microsoft::WRL::ComPtr<ID2D1DeviceContext1> m_d2dContext;
    Microsoft::WRL::ComPtr<IWICImagingFactory2> m_wicFactory;
    
    これらの Object は DeviceResources Class(Common\DeviceResources.h) に private で定義されていて、 App1Main Class の Constructor で渡される deviceResources のアクセサーで取得することが出来ます。
    LoadImageFile() 関数を組み込む Class(今回は App1Main)で用意して下さい。
        m_d2dContext = m_deviceResources->GetD2DDeviceContext();
        m_wicFactory = m_deviceResources->GetWicImagingFactory();
    
  2. それでは LoadImageFile() 関数を組み込んでプログラムを作成します。
    空プロジェクト を参照してベースとなる XAML 無しのプロジェクトを構築して下さい。
  3. App1Main.h に LoadImageFile() 関数の宣言と使用する領域を定義します。
    LoadImageFile(PCWSTR uri); は関数のプロトタイプ宣言です。
    m_bitmapPerspective; に画像をロードします。
        Microsoft::WRL::ComPtr<ID2D1Bitmap1>         LoadImageFile(PCWSTR  uri);
        Microsoft::WRL::ComPtr<ID2D1DeviceContext1>  m_d2dContext;
        Microsoft::WRL::ComPtr<IWICImagingFactory2>  m_wicFactory;
        Microsoft::WRL::ComPtr<ID2D1Bitmap1>         m_bitmapPerspective;
    
  4. App1Main.cpp の Constructor で m_d2dContext と m_wicFactory を設定します。
    LoadImageFile(L"ayu.jpg"); を呼び出して m_bitmapPerspective を取得します。
    あとは、m_bitmapPerspective を使って描画するだけです。
    App1Main::App1Main(const std::shared_ptr<DX::DeviceResources>& deviceResources) :
        m_deviceResources(deviceResources)
    {
         ・・・
    
        m_d2dContext = m_deviceResources->GetD2DDeviceContext();
        m_wicFactory = m_deviceResources->GetWicImagingFactory();
        m_bitmapPerspective = LoadImageFile(L"ayu.jpg");
    }
    
  5. App1Main.cpp の Render() 関数で画像を描画します。
    bool App1Main::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);  }
        return true;
    }
    
  6. 画像ファイルを入力して、ID2D1Bitmap1 をリターンする LoadImageFile() 関数です。
    パラメータとして PCWSTR uri を受け取って画像を入力します。
    App1Main.cpp の適当な場所に張り付けて下さい。
    // ★LoadImageFile 関数  前田 稔
    Microsoft::WRL::ComPtr<ID2D1Bitmap1> App1Main::LoadImageFile(PCWSTR  uri)
    {
        Microsoft::WRL::ComPtr<ID2D1Bitmap1>  bitmapPerspective;
    
        Microsoft::WRL::ComPtr<IWICBitmapDecoder> decoder;
        DX::ThrowIfFailed(
            m_wicFactory->CreateDecoderFromFilename(
                uri,
                nullptr,
                GENERIC_READ,
                WICDecodeMetadataCacheOnDemand,
                &decoder
                )
            );
    
        Microsoft::WRL::ComPtr<IWICBitmapFrameDecode> frame;
        DX::ThrowIfFailed(
            decoder->GetFrame(0, &frame)
            );
    
        Microsoft::WRL::ComPtr<IWICFormatConverter> converter;
        DX::ThrowIfFailed(
            m_wicFactory->CreateFormatConverter(&converter)
            );
    
        DX::ThrowIfFailed(
            converter->Initialize(
                frame.Get(),
                GUID_WICPixelFormat32bppPBGRA,
                WICBitmapDitherTypeNone,
                nullptr,
                0.0f,
                WICBitmapPaletteTypeCustom
                )
            );
    
        DX::ThrowIfFailed(
            m_d2dContext->CreateBitmapFromWicBitmap(
                converter.Get(),
                nullptr,
                &bitmapPerspective
                )
            );
        return bitmapPerspective;
    }
    
  7. プロジェクトのフォルダに画像ファイル(ayu.jpg など)を格納します。
    プロジェクト名を右クリックして、追加/既存項目から画像ファイルを選択します。
    Assets の フォルダーに Assets/ayu.jpg が追加されます。
    呼び出すときは LoadImageFile(L"ayu.jpg"); とします。
    Windows 8 でも同様のプログラム DX2D Load Bitmap を作成しています。
    Windows 10 でも Windows10 Image 実行を確認しました。

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