2016-11-11 5 views
0

Ich arbeite mit Direct2D Renderziele und ich habe ein Objekt vom Typ ID2D1Bitmap. Ich muss diese Bitmap in einem WPF Fenster anzeigen und ich dachte, diese Bitmap in einem Image Steuerelement zu hosten. Um dies zu tun, könnte eine Lösung darin bestehen, das Objekt ID2D1Bitmap in ein Objekt System::Windows::Media::ImageSource zu konvertieren oder das Bitmap in eine Datei zu speichern, die anschließend geladen werden kann.Wie konvertiert man eine ID2D1Bitmap in eine ImageSource

Ich habe versucht, verschiedene Ansätze zu suchen, aber ohne Ergebnis, weil die Direct2D-APIs keine Lösung AFAIK bieten.

Gibt es eine Möglichkeit, dies zu tun?

+0

Vielleicht kann Ihnen das helfen. [Konvertieren von Bitmap zu ImageSource] (http://stackoverflow.com/questions/26260654/wpf-converting-bitmap-to-imagesource) – MSL

+0

Haben Sie gesehen: https://github.com/Microsoft/WPFDXInterop, und Sie tun Haben Sie einen Beispielcode, mit dem wir spielen können? –

+0

Warum antwortest du nicht Leuten, die versuchen zu helfen? –

Antwort

0

Beste Lösung, die ich für WPF und UWP-Anwendungen gefunden habe, ist SharpDX. Siehe SharpDX website.

Ich habe versucht, die D2DWrappers in der Vergangenheit zu verwenden (see the Microsoft site), aber in meiner UWP-Entwicklung fand ich den SharpDX-Code einfacher zu verwenden. Ich würde genauso für WPF denken, da es auch C# -Code ist.

0

Direct2D-Bitmaps sind Hardwaregeräte-abhängige Ressourcen und im Allgemeinen nicht leicht von der CPU-Seite des Systems aus zugänglich. Es ist daher schwierig, die Pixel der ID2D1Bitmap zu erreichen, sie ist nicht entworfen und soll auch nicht auf diese Weise verwendet werden. Jeder Mechanismus, der rohe Bytes aus einer Direct2D-Bitmap erhält, erstellt dies normalerweise, indem er eine WIC-Bitmap daraus erstellt, um auf den Byte-Stream zuzugreifen. Auf diese Weise können Sie es in eine Datei oder sogar in ein Byte-Array schreiben und mit einem Interop in C# darauf zugreifen. Wenn Sie es in eine Datei schreiben und in WPF lesen möchten, funktioniert dieser Mechanismus. Wenn Sie die Bitmap-Daten in einem IWICBitmapSource-Objekt während der Verarbeitung haben und wenn Sie es zwischenspeichern können, wäre der Auftrag einfacher. Umwandlung einer System.Drawing.Bitmap in eine System.Windows.Media.ImageSource wird hier beantwortet: Converting Bitmap to ImageSource (Dank @MSL, die die obige Antwort in den Kommentaren hingewiesen).

An dieser Stelle ist die Art, wie Sie es verwenden, etwas unklar, ein bisschen mehr Informationen über den beabsichtigten Gebrauch oder eine kurze Probe würde hier wirklich helfen.

EDIT 1: einen Blick auf dieses SO Qn Nehmen: Save ID2D1Bitmap to file und die Kommentare für eine Version von Code, der eine ID2D1Bitmap in eine Datei speichert. Es führt im Wesentlichen die Umwandlung zu IWICBitmap durch und schreibt es in eine Datei aus. Da IWICBitmap in diesem Schritt von IWICBitmapSource erbt, können Sie sogar die CopyPixels()-Methode verwenden, um die Bitmap-Daten in ein Bytearray auszugeben, falls Sie dies wünschen.

Nun, wenn Sie mit dem Ansatz werden in eine Datei zu speichern, ein System.Drawing.Bitmap bekommen ist so einfach wie:

bitmap = new Bitmap("<YOUR_BITMAP_FILENAME>") 

Und Sie können es zu einem Bitmap für die Verwendung in WPF konvertieren, wie:

using(MemoryStream memstream = new MemoryStream()) 
{ 
    bitmap.Save(memstream, ImageFormat.Bmp); 
    memstream.Position = 0; 
    BitmapImage bitmapImage = new BitmapImage(); 
    bitmapImage.BeginInit(); 
    bitmapImage.StreamSource = memstream; 
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
    bitmapImage.EndInit(); 
} 
+0

Wie kann ich eine WIC-Bitmap aus der ID2D1Bitmap-Quelle erstellen, um auf ihren Byte-Stream zuzugreifen? Es wäre auch nützlich zu erklären, wie ich von einer WIC-Bitmap-Quelle die Drawing.Bitmap erhalten kann. – Nick

+0

Ich sah Ihre Bearbeitung, aber wenn ich den Code ausführe, erhalte ich einen D2DERR_WRONG_RESOURCE_DOMAIN-Fehler (wenn ich die Bitmap zeichne) in das Wic-Renderziel. – Nick

+0

Versuchen Sie es mit rtProps.type = D2D1_RENDER_TARGET_TYPE_SOFTWARE; rtProps.usage = D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE; – jester

Verwandte Themen