2009-07-29 9 views

risposta

1

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.

+0

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). –

9

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); 
} 
+0

Se è necessario convertire le immagini con canale alfa (con parti trasparenti), utilizzare System.Windows.Media.Imaging.PngBitmapEncoder() anziché System.Windows.Media.Imaging.BmpBitmapEncoder(). –

+0

@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? –

+1

@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. –