2009-07-29 38 views

回答

1

請參閱HOW TO USE IMAGESOURCE (NO HANDLER) IN WINFORMS AS SYSTEM.DRAWING.BITMAP (HBITMAP)

如何輕鬆轉換的WinForms System.Drawing.Bitmap到WPF 您的ImageSource從這個 文章教訓。今天,我將解釋如何做 它與此相反。其實,所有他必須 要做的就是從 的BitmapSource提取處理,然而,這樣的做法 不支持,因此唯一 我們能做的也只是 的BitmapSource(或BitmapFrame)的像素複製到 字節數組,然後將它們複製到HBitmap的指針 中。

+0

之前削減圖像尺寸兩者這和以前的職位是相同的方法:複製位圖的掃描線的字節數組,然後從內存塊創建一個位圖。位圖假定存儲器塊在位圖生存期中包含掃描行。但是,在離開固定(byte * pB = bits)代碼後,內存可能會被.net內存管理器覆蓋,並且位圖被損壞。解決方案是使用Marshal.AllocHGlobal,但在這種情況下,內存塊必須由用戶代碼維護(即:必須在Marshal.FreeHGlobal使用後釋放)。 – 2014-11-03 11:12:30

9

其較舊的OP,但它仍然可以派上用場,因爲它需要一些時間才能找到沒有dll互操作或剪貼板黑客的更乾淨的解決方案。

這個工作對我來說,你可以使用包括PNGEncoder保存到文件或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

如果您需要使用Alpha通道(使用透明部分)轉換圖像,請使用System.Windows.Media.Imaging.PngBitmapEncoder()而不是System.Windows.Media.Imaging.BmpBitmapEncoder()。 – 2014-11-03 10:42:08

+0

@DariuszWasacz我無法得到這個工作的答案。它抱怨image.Source不起作用:**'System.Drawing.Image'不包含'Source'的定義,並且沒有接受'System.Drawing.Image'類型的第一個參數的擴展方法'Source'可能是發現。** 我檢查了MSDN,並且圖像沒有Source屬性。你有什麼想法需要解決的? – 2015-02-11 23:20:09

+1

@kayleeFrye_onDeck:請注意,System.Drawing和System.Windows.Media命名空間都包含類'Image'。它看起來像是在參數'System.Windows.Media.Image image'中省略了命名空間,而'System.Drawing.Image'是從使用語句中取得的。請檢查您的代碼是否與上述完全相同。 – 2015-02-16 08:02:25

相關問題