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) - 何でもプログラミング