Come posso convertire System.Windows.Media.ImageSource in System.Drawing.Bitmap in C#?Converti System.Windows.Media.ImageSource in System.Drawing.Bitmap
risposta
Vedere HOW TO USE IMAGESOURCE (NO HANDLER) IN WINFORMS AS SYSTEM.DRAWING.BITMAP (HBITMAP):
Come convertire facilmente WinForms System.Drawing.Bitmap in WPF ImageSource hai imparato da questo articolo. Oggi, ti spiegherò come fare contrario. In realtà, tutto quello che hanno a che fare è estrarre handler da BitmapSource, tuttavia, tale approccio non è supportato, così l'unica cosa che che possiamo fare è semplicemente copiare i pixel di BitmapSource (o BitmapFrame) in una matrice di byte e poi copiarli nel puntatore di HBitmap.
il suo vecchio OP, ma può ancora tornare utile per alcune altre persone, poiché ci è voluto del tempo per trovare una soluzione più pulita senza interfaccessioni di dll o clipboard.
questo ha funzionato per me, è possibile utilizzare pngencoder per tagliare le dimensioni dell'immagine prima di salvare in un file o flusso RTF
private System.Drawing.Image ImageWpfToGDI(System.Windows.Media.ImageSource image) {
MemoryStream ms = new MemoryStream();
var encoder = new System.Windows.Media.Imaging.BmpBitmapEncoder();
encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(image as System.Windows.Media.Imaging.BitmapSource));
encoder.Save(ms);
ms.Flush();
return System.Drawing.Image.FromStream(ms);
}
Se è necessario convertire le immagini con canale alfa (con parti trasparenti), utilizzare System.Windows.Media.Imaging.PngBitmapEncoder() anziché System.Windows.Media.Imaging.BmpBitmapEncoder(). –
@DariuszWasacz Non riesco a far funzionare questa risposta. Si lamenta che image.Source non funziona: ** 'System.Drawing.Image' non contiene una definizione per 'Source' e nessun metodo di estensione 'Source' che accetta un primo argomento di tipo 'System.Drawing.Image' potrebbe essere trovato. ** Ho controllato MSDN e Image non ha una proprietà Source. Hai idea di cosa debba essere riparato? –
@kayleeFrye_onDeck: Si noti che sia gli spazi dei nomi System.Drawing che System.Windows.Media contengono la classe 'Image'. Sembra che tu abbia omesso lo spazio dei nomi nell'argomento 'System.Windows.Media.Image image' e 'System.Drawing.Image' è stato preso dall'uso delle istruzioni. Si prega di verificare se il codice è esattamente lo stesso di sopra. –
- 1. Disegnare un nuovo System.Drawing.Bitmap
- 2. Converti Kinect ColorImageFrame in Bitmap
- 3. Winforms C#: come modificare DPI di System.Drawing.BItmap?
- 4. Alternativa a System.Drawing.Bitmap in Silverlight che è compatibile con WPF
- 5. Utilizzo del controllo immagine in WPF per visualizzare System.Drawing.Bitmap
- 6. Impossibile convertire implicitamente il tipo 'System.Drawing.Image' a 'System.Drawing.Bitmap'`
- 7. Converti UIImage in NSData e converti in UIImage in Swift?
- 8. Converti PDF in HTML
- 9. Converti CSS in HTML
- 10. Converti array in JSON
- 11. Converti XmlNodeList in XmlNode []
- 12. Converti audio in testo
- 13. Converti UIImage in CVPixelBufferRef
- 14. Converti System.Windows.Media.Brush in System.Drawing.Brush
- 15. Converti cvs in mercurial
- 16. Converti xml_nodeset in data.frame
- 17. Converti unicode in emoji
- 18. Converti DateTime in Double
- 19. Converti JsDefined in stringa
- 20. Converti mm in pixel
- 21. Converti NSMutableAttributedString in NSString
- 22. Converti righe in colonne
- 23. Converti IFile in file
- 24. Converti AsyncTask in RxAndroid
- 25. Converti array in JSON
- 26. Converti JSON in NSArray
- 27. Converti percorso in poligono
- 28. Converti MKCoordinateRegion in MKMapRect
- 29. converti NSTaggedPointerString in NSString
- 30. Converti stringa in SocketAddr
Sia questo e post precedenti sono lo stesso approccio: copiare linee di scansione bitmap in un array di byte e quindi creare una bitmap dal blocco di memoria. La bitmap presuppone che il blocco di memoria contenga linee di scansione durante la vita della bitmap. Tuttavia, dopo aver lasciato il codice fisso (byte * pB = bit), la memoria può essere sovrascritta dal gestore di memoria .net e la bitmap viene corrotta. La soluzione è utilizzare Marshal.AllocHGlobal, ma in questo caso il blocco di memoria deve essere gestito dal codice utente (ovvero: deve essere liberato dopo l'uso da Marshal.FreeHGlobal). –