2012-04-02 17 views
0

Ich versuche, eine ID2D1Bitmap aus einer Bitmap-Ressource zu laden. Um dies zu tun, konsultierte ich eine MSDN guide, die mir sagte, die Windows Imaging-Komponente (IWIC) zu verwenden, um das Bild zu verarbeiten, bevor Direct2D es verwendet.IWICImagingFactory :: CreateDecoderFromStream() schlägt fehl, Fehlermeldung ist nicht hilfreich

Allerdings schlägt es fehl, wenn ich CreateDecoderFromStream() aufrufen, und es gibt eine seltsame Fehlermeldung zurück - 0x88982f50 - das sagt mir nichts. Ich habe Google durchsucht und DirectX Error Lookup verwendet. Die DirectX-Fehler Lookup Tool sagt mir nur das:

HRESULT: 0x88982f50 (2291674960) 
Name: Unknown 
Description: n/a 
Severity code: Failed 
Facility Code: FACILITY_DWRITE (2200) 
Error Code: 0x2f50 (12112) 

Dies ist der Code, den ich mit einem ID2D1Bitmap von einer Ressource zu versuchen und zu laden:

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

Es ist ein WIC-Fehler zu tun. Es entspricht "WINCODEC_ERR_COMPONENTNOTFOUND". [Hier] (http://blogs.msdn.com/b/xwebsupport/archive/2009/09/29/expression-web-studio-2-crashes-on-setup-exception-has-beth-by-thrown-by- Sie können eine Diskussion finden, die für Sie hilfreich sein kann. –

+0

... Ich verstehe ... Ich muss einen anderen Weg finden um eine ID2D1Bitmap aus einer Ressource zu erstellen. – Joshua

Antwort

0

Es stellt sich heraus ich nicht verwenden der WIC-Decoder für meine Bitmap-Ressource, weil es sich scheinbar um Rohpixeldaten handelt, die nicht decodiert werden können.

+0

Speichern Sie Ihre Bitmap-Ressource in einem tatsächlichen Bilddateiformat - wie PNG oder JPG - und es wird funktionieren. Wenn Sie Ihre Bitmap-Ressource als rohe Bitmap-Daten speichern, müssen Sie sie nicht dekodieren. Kopieren Sie in diesem Fall die Daten direkt in die Zieltextur. – d7samurai

0

(Ich verstehe diesen Beitrag von ein bisschen alt, aber ich stelle hier das im Falle hilft es jemand anderes oder das OP, wenn er dies wieder zu je sehen geschieht.)

ich exakt den gleichen Code haben wie Sie zum Laden einer ID2D1Bitmap von einer Ressource in Ihrer EXE-Datei mit WIC, außer meiner funktioniert perfekt. Ich kann eine Bitmap aus meiner EXE-Datei einwandfrei laden. Der einzige Unterschied in meinem Code, der sich von meinem unterscheidet, ist der, dass ich statt eines (BYTE *) Cast einen reinterpret_cast verwende.

Also statt

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

Ich würde versuchen,

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

Casting nach/von BYTE * funktioniert unabhängig vom Casting-Operator, den Sie verwenden. – selbie

+0

Ihr wahrscheinlich richtig, aber ich denke immer noch, es könnte einen Versuch wert sein. Unser Code ist buchstäblich GENAU derselbe, außer für diese eine Zeile. Wenn also jemand dieses Problem hat, wäre es ein Versuch, zu sehen, ob sich irgendetwas ändern könnte, wenn Sie reinterpret_cast anstelle von expliziter Konvertierung verwenden oder umgekehrt. –

+1

Wenn Sie Casting-Operationen in C/C++ verstehen, wissen Sie wahrscheinlich, dass der einzige Unterschied zwischen den differenc-Operatoren beim Umwandeln in abgeleitete Klassen (dh bei denen die Vererbungshierarchie einen Offset zwischen Basisklassenadressen oder V-Tabellen-Offset diktiert) gilt Das Ergebnis der Besetzung ist eine andere Speicheradresse. Bei allgemeinen Castings zwischen reinen alten Datentypen ändert sich die resultierende Adresse nicht. Prost. – selbie