2016-11-11 2 views
0

Je travaille avec Direct2D cibles de rendu et j'ai un objet de type ID2D1Bitmap. J'ai besoin d'afficher cette bitmap dans une fenêtre WPF et je pensais héberger cette bitmap dans un contrôle Image. Pour ce faire, une solution pourrait être de convertir l'objet ID2D1Bitmap en un objet System::Windows::Media::ImageSource, ou de sauvegarder le bitmap dans un fichier qui pourrait être chargé par la suite.Comment convertir un ID2D1Bitmap en un ImageSource

J'ai essayé de chercher différentes approches mais sans aucun résultat, car les API Direct2D n'offrent aucune solution AFAIK.

Y at-il un moyen de le faire?

+0

Peut-être que cela peut vous aider. [Convertir Bitmap en ImageSource] (http://stackoverflow.com/questions/26260654/wpf-converting-bitmap-to-imagesource) – MSL

+0

Avez-vous vu ceci: https://github.com/Microsoft/WPFDXInterop, et avez-vous avoir un exemple de code avec lequel on peut jouer? –

+0

Pourquoi ne répondez-vous pas aux personnes qui essaient d'aider? –

Répondre

0

La meilleure solution que j'ai trouvée pour les applications WPF et UWP est SharpDX. Voir le SharpDX website.

J'ai essayé d'utiliser les D2DWrappers dans le passé (see the Microsoft site), mais dans mon développement UWP, j'ai trouvé le code SharpDX plus facile à utiliser. Je pense que c'est la même chose pour WPF car c'est aussi du code C#.

0

Les bitmaps Direct2D sont des ressources dépendantes du matériel et ne sont généralement pas facilement accessibles depuis le côté CPU du système. Atteindre les pixels du ID2D1Bitmap est donc difficile, il n'est pas conçu non plus, il est destiné à être utilisé de cette façon. Tout mécanisme qui obtient des octets bruts à partir d'un bitmap Direct2D le fait généralement en créant un bitmap WIC à partir de celui-ci pour accéder au flux d'octets. De cette façon, vous pouvez l'écrire dans un fichier ou même un tableau d'octets et utiliser un peu d'interop pour y accéder en C#. Si vous voulez l'écrire dans un fichier et le lire dans WPF, ce mécanisme fonctionnera. Si vous avez les données bitmap dans un objet IWICBitmapSource à un moment pendant le traitement, et si vous pouvez le mettre en cache, le travail serait plus facile. La conversion d'un System.Drawing.Bitmap en un System.Windows.Media.ImageSource est répondu ici: Converting Bitmap to ImageSource (Merci à @MSL qui a souligné la réponse ci-dessus dans les commentaires). À ce stade, la façon dont vous l'utilisez est un peu floue, un peu plus d'informations sur l'utilisation prévue ou un échantillon court aiderait vraiment ici.

EDIT 1: Jetez un oeil à ce SO Qn: Save ID2D1Bitmap to file et les commentaires pour une version de code qui enregistre un ID2D1Bitmap dans un fichier. Il effectue essentiellement la conversion à IWICBitmap et l'écrit dans un fichier. À cette étape, puisque IWICBitmap hérite de IWICBitmapSource, vous pouvez même utiliser la méthode CopyPixels() pour vider les données bitmap dans un tableau d'octets, si vous le souhaitez.

Maintenant, si vous allez à l'approche de l'enregistrer dans un fichier, obtenir un System.Drawing.Bitmap est aussi simple que:

bitmap = new Bitmap("<YOUR_BITMAP_FILENAME>") 

Et vous pouvez le convertir en un BitmapImage pour une utilisation dans WPF comme:

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

Comment puis-je créer un bitmap WIC à partir de la source ID2D1Bitmap afin d'accéder à son flux d'octets? Aussi, il serait utile d'expliquer comment à partir d'une source bitmap WIC, je peux obtenir le Drawing.Bitmap. – Nick

+0

J'ai vu votre modification, mais lorsque j'exécute le code, j'obtiens une erreur D2DERR_WRONG_RESOURCE_DOMAIN (lorsque je dessine le bitmap) dans la cible de rendu wic. – Nick

+0

Essayez d'utiliser rtProps.type = D2D1_RENDER_TARGET_TYPE_SOFTWARE; rtProps.usage = D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE; – jester