Direct2D Bitmap aus Pfad laden.



  • Hallo Community, ich hoffer Ihr könnt mir helfen. Ich mag mir einen kleinen DX Wrapper aus Spaß erstellen. Nur ist mein Problemm, dass wenn ich aus einem Pfad eine Bitmap laden möchte, das ich einen Nullpointer bekomme.

    void Direct2DWrapper::Graphics::dwDrawBitmap(System::String^ str, float Top, float Left, float Right, float Bottom, float Width, float Height)
    	{
    		IntPtr strptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str);
    		LPCWSTR Path = (LPCWSTR) strptr.ToPointer();
    		IWICImagingFactory* factory;
    		IWICBitmapDecoder* decoder = NULL;
    		IWICBitmapFrameDecode* source = NULL;
    
    		IWICStream* stream = NULL;
    		IWICFormatConverter* converter = NULL;
    		IWICBitmapScaler* scaler = NULL;
    		ID2D1Bitmap* d2dbmp = NULL;
    
    		// Client Recteck
    		RECT cr;
    		GetClientRect(this->Container, &cr);
    
    		// Image Factory erstellen
    		CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, CLSID_WICImagingFactory, (LPVOID*) &factory);
    
    		// Decoder erstellen
    		factory->CreateDecoderFromFilename(Path, NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &decoder);
    
    		// Frame Laden
    		decoder->GetFrame(0,&source);
    
    		// Format Converter Erstellen
    		factory->CreateFormatConverter(&converter);
    
    		// Format Konvertieren
    		converter->Initialize(source, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeMedianCut);
    
    		// Bitmap erstellen
    		this->GraphicsTarget->CreateBitmapFromWicBitmap(converter, NULL, &d2dbmp);
    
    		// Renderer Starten
    		this->GraphicsTarget->BeginDraw();
    
    		// Bild Zeichnen
    		this->GraphicsTarget->DrawBitmap(d2dbmp,D2D1::RectF(cr.left + Left, cr.top + Top, cr.right - Right, cr.bottom - Bottom));
    
    		// Renderer Beenden
    		this->GraphicsTarget->EndDraw();
    
    	}
    


  • IntPtr strptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str); 
    LPCWSTR Path = (LPCWSTR) strptr.ToPointer();
    

    Wenn du es auf LPCSTR casten würdest statt auf LPCWSTR würde es gehen. StringToHGlobalAnsi gibt nunmal keinen widechar string zurück, drum sind im Pfad massenhaft Sonderzeichen und die Datei wird nicht gefunden.
    Mal ganz davon abgesehen dass mir dieses rumgecaste sehr suspekt vorkommt. 😕



  • Besser StringToHGlobalUni verwenden.
    Den String danach wieder freigeben wäre auch net schlecht.
    Und Abfrage des Fehlercodes bei den ganzen Aufrufen wäre auch gut.

    ps: Wieso verwendest du nicht einfach SharpDX?


Anmelden zum Antworten