Auto2D IMAGE

自動生成した Direct2D で IMAGE を描画します。

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

プロジェクトの作成

  1. 自動生成した Direct2DApp1 で IMAGE を描画します。
    IMAGE(画像ファイル)の描画は事前の準備が必要で、TEXT や矩形のように「いきなり描画する」ことは出来ないようです。
    Direct2D では Windows Imaging Component(WIC)を使用してビットマップを読み込みます。
    ファイルからビットマップを読み込むには、まず WIC オブジェクトを使用して、イメージを読み込んで Direct2D 互換の形式に変換します。
    次に、ウインドウに直接描画可能な ID2D1Image形式(ID2D1Effect や ID2D1Bitmap1)を作成します。
    そして DrawImage() メソッドから ID2D1Image をパラメータにして描画します。
    かなり面倒な手順なのですが、Direct2D で画像を描画するときは、これに従わなければならないようです。
    但し、DirectXPage.xaml に Image Control を貼り付ける方法なら、プログラムの知識は不要で作業も簡単です。
    Image Control を参照して下さい。
  2. それでは、プログラムの作成にかかりましょう。
    最初に Direct2DApp1 のプロジェクトを自動生成します。
    Windows8 のスタート画面から Visual Studio を起動します。
    [FILE] [New Project] から [Visual C++] を選択して、Direct2Dアプリケーション(XAML)を選びます。
    後は規定値で [OK] をクリックすると、プロジェクト(Direct2DApp1)が構築されます。
    Direct2DApp1 は、Direct2D のプロジェクト名の規定値です。
    そのまま右三角アイコンでコンパイル&実行します。
    ウインドウに次の文字が表示されます。
        Hello, XAML!
        Hello, DirectX!
        
  3. SimpleTextRenderer.h に次の領域を定義します。
        Microsoft::WRL::ComPtr<IWICFormatConverter> m_wicFormatConverter;
        Microsoft::WRL::ComPtr<ID2D1Effect>         m_bitmapSourceEffect;
        
  4. SimpleTextRenderer.cpp を表示してソースコードを修正します。
    1. CreateDeviceIndependentResources() です。
      画像ファイルを入力して decoder に設定します。
      decoder から frame に設定します。
      m_wicFormatConverter を生成します。
      frame から m_wicFormatConverter に設定します。
      void SimpleTextRenderer::CreateDeviceIndependentResources()
      {   DirectXBase::CreateDeviceIndependentResources();
          ComPtr<IWICBitmapDecoder> decoder;
          DX::ThrowIfFailed(
              m_wicFactory->CreateDecoderFromFilename(
                  L"ffx2s.jpg",
                  nullptr,
                  GENERIC_READ,
                  WICDecodeMetadataCacheOnDemand,
                  &decoder
                  )
              );
          ComPtr<IWICBitmapFrameDecode> frame;
          DX::ThrowIfFailed(
              decoder->GetFrame(0, &frame)
              );
          DX::ThrowIfFailed(
              m_wicFactory->CreateFormatConverter(&m_wicFormatConverter)
              );
          DX::ThrowIfFailed(
              m_wicFormatConverter->Initialize(
                  frame.Get(),
                  GUID_WICPixelFormat32bppPBGRA,
                  WICBitmapDitherTypeNone,
                  nullptr,
                  0.0f,
                  WICBitmapPaletteTypeCustom 
                  )
              );
      }
      
    2. CreateDeviceResources() 関数です。
      m_wicFormatConverter から、リソース(m_bitmapSourceEffect)を作成します。
      void SimpleTextRenderer::CreateDeviceResources()
      {   DirectXBase::CreateDeviceResources();
          DX::ThrowIfFailed(
              m_d2dContext->CreateEffect(CLSID_D2D1BitmapSource, &m_bitmapSourceEffect)
              );
          DX::ThrowIfFailed(
              m_bitmapSourceEffect->SetValue(
                  D2D1_BITMAPSOURCE_PROP_WIC_BITMAP_SOURCE,
                  m_wicFormatConverter.Get()
                  )
              );
          DX::ThrowIfFailed(
              m_bitmapSourceEffect->SetValue(
                  D2D1_BITMAPSOURCE_PROP_INTERPOLATION_MODE,
                  D2D1_BITMAPSOURCE_INTERPOLATION_MODE_LINEAR
                  )
              );
          DX::ThrowIfFailed(
              m_bitmapSourceEffect->SetValue(
                  D2D1_PROPERTY_CACHED,
                  TRUE 
                  )
              );
      }
      
    3. Render() 関数です。
      DrawImage() で m_bitmapSourceEffect のイメージを描画します。
      m_renderNeeded を false に設定すると描画処理が実行されます。
      void SimpleTextRenderer::Render()
      {   m_d2dContext->BeginDraw();
          m_d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));
          m_d2dContext->DrawImage(m_bitmapSourceEffect.Get());
          HRESULT hr = m_d2dContext->EndDraw();
          if (hr != D2DERR_RECREATE_TARGET)
          {   DX::ThrowIfFailed(hr);
          }
          m_renderNeeded = false;
      }
      
    4. DrawImage() 関数の仕様です。
      詳細は デベロッパーセンターを参照して下さい。
          void DrawImage(
            [in]            ID2D1Image *image,
            [in, optional]  const D2D1_POINT_2F *targetOffset,
            [in, optional]  const D2D1_RECT_F *imageRectangle,
            D2D1_INTERPOLATION_MODE interpolationMode,
            D2D1_COMPOSITE_MODE compositeMode
          );
          
  5. 後は画像ファイル("ffx2s.jpg")をプロジェクトのフォルダに格納して加えて下さい。
    "ffx2s.jpg" は画像を問わないので適当なファイルを調達して下さい。
    IMAGE の描画に伴い、TEXT 描画は必要ないので、関連するソースを削除して整理して下さい。
    それと SimpleTextRenderer.cpp の名前も変更したいですね。 (^_^;)

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