bmp,gif,jpg,pngの画像ファイルをID2D1Bitmapへ変換するサンプルです。
LoadImage内でファイルをbinaryで取得しStreamへ変換しID2D1Bitmapを作成します。
なお、ID2D1RenderTargetを再構築するとID2D1Bitmapも作り直しが必要なので、StreamかFileNameは
どこかで保持する必要があります。

Binaryクラスはここです。


#include "stdafx.h"
#include "binary.h"
#include

bool LoadImage( LPCWSTR filename, ID2D1RenderTarget* target, ID2D1Bitmap** ret )
{
CComPtr sm;
CComPtr bmp;

Binary bin;
bool bl;
bl = BinaryFromFile(filename, bin);
bl = BinaryToIStream( bin, &sm );
bl = LoadImageFromIStream1( target, sm, &bmp);

*ret = bmp.Detach();
(*ret)->AddRef();

return true;
}



bool BinaryFromFile( LPCWSTR fnm, Binary& ret )
{
HANDLE h = CreateFile( fnm, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL );

if ( h != INVALID_HANDLE_VALUE )
{
DWORD len = GetFileSize( h, NULL );

Binary bin(0,len);
DWORD lx=0;

::ReadFile( h,bin.get(), len,&lx,0);

ret = bin;

::CloseHandle(h);
return true;
}

return false;
}
bool BinaryToIStream( const Binary& bin, IStream** ret )
{
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, bin.length());
LPVOID pImage = ::GlobalLock(hMem);
memcpy(pImage, bin.get(), bin.length());
::GlobalUnlock(hMem);

CComPtr spStream;
if ( S_OK == ::CreateStreamOnHGlobal(hMem,TRUE, &spStream ))
{
*ret = spStream;
(*ret)->AddRef();
return true;
}
return false;
}



bool LoadImageFromIStream1( ID2D1RenderTarget* target, IStream* sm, ID2D1Bitmap** bmp )
{
HRESULT hr;
CComPtr pStream;
CComPtr pWICFactory;

hr = CoCreateInstance( CLSID_WICImagingFactory, NULL, CLSCTX_ALL, __uuidof(IWICImagingFactory), (void**)&pWICFactory );
if ( hr != S_OK ) return false;

hr = pWICFactory->CreateStream( &pStream );
if ( hr != S_OK ) return false;

hr = pStream->InitializeFromIStream( sm ); // bmp,gif,jpg,png OK
if ( hr != S_OK ) return false;

CComPtr pDecoder;
CComPtr pSource;
CComPtr pConverter;

hr = pWICFactory->CreateDecoderFromStream( pStream, 0, WICDecodeMetadataCacheOnLoad, &pDecoder );
if ( hr != S_OK ) return false;
hr = pDecoder->GetFrame(0, &pSource);
if ( hr != S_OK ) return false;

// Convert the image format to 32bppPBGRA
// (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED).
hr = pWICFactory->CreateFormatConverter(&pConverter);
if ( hr != S_OK ) return false;
hr = pConverter->Initialize( pSource, GUID_WICPixelFormat32bppPBGRA,WICBitmapDitherTypeNone,NULL,0.f,WICBitmapPaletteTypeMedianCut);
if ( hr != S_OK ) return false;
hr = target->CreateBitmapFromWicBitmap(pConverter,NULL,bmp );

return ( hr == S_OK );
}