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?