我正在尝试从位图资源加载 ID2D1Bitmap。为此,我查阅了MSDN 指南,该指南告诉我在 Direct2D 使用图像之前使用 Windows 映像组件 (IWIC) 处理图像。
但是,当我调用它时它失败CreateDecoderFromStream()
了,它返回了一条奇怪的错误消息——0x88982f50
它什么也没告诉我。我搜索了谷歌并使用了 DirectX 错误查找。DirectX 错误查找工具只告诉我:
HRESULT: 0x88982f50 (2291674960)
Name: Unknown
Description: n/a
Severity code: Failed
Facility Code: FACILITY_DWRITE (2200)
Error Code: 0x2f50 (12112)
这是我用来尝试从资源加载 ID2D1Bitmap 的代码:
int LoadBitmapFromResource( IWICImagingFactory *pIWICFactory, ID2D1RenderTarget *pRT, int resID, ID2D1Bitmap **ppD2DBitmap )
{
int errmsg;
HRSRC hbmp;
HGLOBAL hbmpdata;
void *pbmp; //system memory pointer to bitmap resource
DWORD bmpsize;
IWICStream *pStream;
IWICBitmapDecoder *pbmpdecoder;
IWICBitmapFrameDecode *pSource;
IWICFormatConverter *pConverter;
hbmp = FindResourceW( GetModuleHandleW(NULL), MAKEINTRESOURCEW(resID), RT_BITMAP );
if( NULL == hbmp )
{
printf("LoadBitmapFromResource::FindResourceW() error: %d\r\n", GetLastError() );
return GetLastError();
}
hbmpdata = LoadResource( GetModuleHandleW(NULL), hbmp );
if( NULL == hbmpdata )
{
printf("LoadBitmapFromResource::LoadResource() error: %d\r\n", GetLastError() );
return GetLastError();
}
pbmp = LockResource( hbmpdata );
if( NULL == pbmp )
{
printf("LoadBitmapFromResource::LockResource() error: %d\r\n", GetLastError() );
return GetLastError();
}
bmpsize = SizeofResource( GetModuleHandleW(NULL), hbmp );
if( NULL == bmpsize )
{
printf("LoadBitmapFromResource::SizeofResource() error: %d\r\n", GetLastError() );
return GetLastError();
}
errmsg = pIWICFactory->CreateStream( &pStream );
if( !SUCCEEDED(errmsg) )
{
printf("LoadBitmapFromResource::CreateStream() error: %x\r\n", errmsg );
return errmsg;
}
errmsg = pStream->InitializeFromMemory( (BYTE*)pbmp, bmpsize );
if( !SUCCEEDED(errmsg) )
{
printf("LoadBitmapFromResource::InitializeFromMemory() error: %x\r\n", errmsg );
return errmsg;
}
errmsg = pIWICFactory->CreateDecoderFromStream( pStream, NULL, WICDecodeMetadataCacheOnLoad, &pbmpdecoder );
if( !SUCCEEDED(errmsg) )
{
printf("LoadBitmapFromResource::CreateDecoderFromStream() error: %x\r\n", errmsg );
return errmsg;
}
errmsg = pbmpdecoder->GetFrame( 0, &pSource );
if( !SUCCEEDED(errmsg) )
{
printf("LoadBitmapFromResource::GetFrame() error: %x\r\n", errmsg );
return errmsg;
}
errmsg = pIWICFactory->CreateFormatConverter( &pConverter );
if( !SUCCEEDED(errmsg) )
{
printf("LoadBitmapFromResource::CreateFormatConverter() error: %x\r\n", errmsg );
return errmsg;
}
errmsg = pConverter->Initialize( pSource, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.0f, WICBitmapPaletteTypeMedianCut );
if( !SUCCEEDED(errmsg) )
{
printf("LoadBitmapFromResource::Initialize() error: %x\r\n", errmsg );
return errmsg;
}
errmsg = pRT->CreateBitmapFromWicBitmap( pConverter, ppD2DBitmap );
if( !SUCCEEDED(errmsg) )
{
printf("LoadBitmapFromResource::CreateBitmapFromWicBitmap() error: %x\r\n", errmsg );
return errmsg;
}
pConverter->Release();
pSource->Release();
pbmpdecoder->Release();
pStream->Release();
return 0;
}