Я пытаюсь загрузить ID2D1Bitmap из растрового ресурса. Для этого я обратился к руководству MSDN , в котором говорилось, что нужно использовать компонент обработки изображений Windows (IWIC) для обработки изображения до его использования Direct2D.
Тем не менее, происходит сбой при вызове CreateDecoderFromStream()
, и он возвращает странное сообщение об ошибке - 0x88982f50
, которое ничего не говорит мне. Я искал Google и использовал DirectX Error Lookup. Средство поиска ошибок 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;
}