2011-05-24 3 views
3

J'ai un problème étrange. J'essaie de récupérer les images déjà chargées dans le contrôle webbrowser. Le code suivant fonctionne très bien dans une application WinForms:wpf InteropBitmap pour bitmap

IHTMLControlRange imgRange = (IHTMLControlRange)((HTMLBody)__ie.NativeDocument.BODY).createControlRange(); 

      foreach (IHTMLImgElement img in __ie.NativeDocument.Images) 
      { 
       imgRange.add((IHTMLControlElement)img); 
       imgRange.execCommand("Copy", false, null); 

       System.IO.MemoryStream stream = new System.IO.MemoryStream(); 
       using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap)) 
       { 
         bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); 
         var image = System.Drawing.Image.FromStream(stream); 
       } 
      } 

Mais le même code si j'utilise en application WPF donne erreur sur

using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject()....... 

L'erreur est la suivante:

" Impossible de convertir un objet de type 'System.Windows.Interop.InteropBitmap' en type 'System.Drawing.Bitmap'. "

Comment résoudre ce problème?

S'il vous plaît quelqu'un peut-il fournir des conseils.

Merci d'avance.

Répondre

4

Le problème que vous rencontrez est qu'il existe deux classes Clipboard différentes, une pour WinForms et une pour WPF. WinForms renvoie des bitmaps utilisables avec WinForms, c'est-à-dire System.Drawing.Bitmap, qui, dans le code que vous utilisez, le copie dans un System.Drawing.Image. Ces types de bitmaps ne sont pas utiles avec WPF, donc le fait que vous ne puissiez pas convertir ce que la version WPF de la classe Clipboard vous donne en un type utile avec WinForms est attendu et n'est pas vraiment votre problème.

Votre problème est que pour WPF vous avez besoin d'un type de bitmap que vous pouvez utiliser avec WPF: un BitmapSource. C'est quelque chose que vous pouvez utiliser avec les contrôles WPF comme Image. Donc, revenir à votre question:

  • si vous utilisez WPF4 vous pouvez utiliser Clipboard.GetImage qui retourne un BitmapSource, exactement ce dont vous avez besoin
  • si vous utilisez quoi que ce soit d'autre, vous pouvez utiliser la technique de Thomas Levesque décrit here

En résumé:

  • Pour WinForms: WinForms clipboard => WinForms bitmaps
  • Pour WPF: Presse-papiers WPF => bitmaps WPF
Questions connexes