Direct2D --- 画像読み込み

Direct2Dにおいて画像ファイルを読み込んで表示する場合、Windows Imaging Component (WIC)を利用します。

今回は実際にそれを実装してみたいと思います。

画像ファイルを32bitRGBAで読み込み

まずIWICImagingFactoryを作成し、factory経由でデコードを行います。

また32bitRGBAに変換するため、IWICFormatConverterを利用します。

#include <wincodec.h>
#include <wrl\client.h>
using namespace Microsoft::WRL;

ComPtr<IWICBitmapSource> WICBitmapFromFile(wchar_t* path)
{
    ComPtr<IWICImagingFactory> factory;
    AssertHR(CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&factory)
    ));

    ComPtr<IWICBitmapDecoder> decoder;
    AssertHR(factory->CreateDecoderFromFilename(
        path,
        NULL,
        GENERIC_READ,
        WICDecodeMetadataCacheOnDemand,
        &decoder
    ));

    ComPtr<IWICBitmapFrameDecode> frame;
    AssertHR(decoder->GetFrame(0, &frame));

    // 32bit RGBAに変換
    ComPtr<IWICFormatConverter> converter;
    AssertHR(factory->CreateFormatConverter(&converter));
    AssertHR(converter->Initialize(
        frame.Get(),
        GUID_WICPixelFormat32bppPBGRA,
        WICBitmapDitherTypeNone,
        NULL,
        0.0f,
        WICBitmapPaletteTypeCustom
    ));

    return converter;
}


Direct2Dアプリケーションで利用

ID2D1RenderTargetのDrawBitmapを利用して描画します。

ComPtr<ID2D1Bitmap> image = WICBitmapFromFile(L"Parrots.bmp");
renderTarget->DrawBitmap(image.Get(), D2D1::RectF(0, 0, width, height));


ただしWICを利用するに際し、アプリケーションの始めにCoInitializeを呼んでおく必要があります。

AssertHR(CoInitialize(NULL));
...
CoUninitialize();


Direct2Dの基本的な使い方は下記を参照してみてください。
Direct2D導入(ID2D1HwndRenderTarget) - 何でもプログラミング
Direct2D導入(ID2D1DeviceContext) - 何でもプログラミング