2012-04-02 166 views
0

我試圖從位圖資源加載ID2D1Bitmap。爲此,我諮詢了一個MSDN guide,它告訴我在使用Direct2D之前使用Windows圖像處理組件(IWIC)處理圖像。IWICImagingFactory :: CreateDecoderFromStream()失敗,錯誤消息消息是沒有幫助的

但是,當我呼叫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; 
} 
+1

這是一個WIC錯誤。它對應於'WINCODEC_ERR_COMPONENTNOTFOUND'。 [這裏](http://blogs.msdn.com/b/xwebsupport/archive/2009/09/29/expression-web-studio-2-crashes-on-setup-exception-has-been-thrown-by-你可能會發現一個可能對你有幫助的討論 – 2012-04-02 21:51:36

+0

...我看到...我必須找到另一種方式從資源創建一個ID2D1Bitmap。 – Joshua 2012-04-03 04:10:12

回答

0

原來我的位圖資源的WIC解碼器,因爲它顯然是無法解碼的原始像素數據。

+0

只需以實際圖像文件格式(如PNG或JPG)存儲位圖資源,它就可以工作。如果將位圖資源存儲爲原始位圖數據,則不需要對其進行解碼。在這種情況下,只需將數據複製直衝目標質感.. – d7samurai 2014-04-20 12:15:00

0

(我知道這個帖子有點老了,但我把這個位置的情況下,它可以幫助別人,或者如果他恰好見過這再次OP)。

我有相同的代碼因爲你使用WIC從exe文件中的資源加載ID2D1Bitmap,除了我的工作完美。我可以完美地從我的exe文件加載一個位圖。代碼中的一個區別與我的不同在於,我使用的是reinterpret_cast,而不是使用(BYTE *)強制轉換。

所以不是

errmsg = pStream->InitializeFromMemory((BYTE*)pbmp, bmpsize); 
    if(!SUCCEEDED(errmsg)) 
    { 
     printf("LoadBitmapFromResource::InitializeFromMemory() error: %x\r\n", errmsg); 
     return errmsg; 
    } 

我會嘗試做

errmsg = pStream->InitializeFromMemory(reinterpret_cast<BYTE*>(pbmp), bmpsize); 
    if(!SUCCEEDED(errmsg)) 
    { 
     printf("LoadBitmapFromResource::InitializeFromMemory() error: %x\r\n", errmsg); 
     return errmsg; 
    } 
+0

鑄造/從BYTE *作品一樣的,不管你使用哪一個轉換操作符。 – selbie 2012-10-28 22:23:55

+0

你可能是對的,但我仍然認爲這可能值得一試。我們的代碼除了那一行之外幾乎完全一樣,所以如果有人有這個問題,那麼值得嘗試一下,看看是否有什麼可能會改變使用reinterpret_cast而不是顯式轉換,反之亦然。 – 2012-10-28 22:40:33

+1

如果您瞭解在C/C++中的投射操作,那麼您可能知道在派生類中進行投射時,差異運算符之間的唯一區別適用(其中繼承heirarchy指示基類地址或v-表偏移之間的偏移),以便轉換的結果是不同的存儲地址。對於普通舊式數據類型之間的一般性轉換,結果地址不會改變。乾杯。 – selbie 2012-10-29 01:27:54

相關問題