如何將System.Windows.Media.ImageSource轉換爲C#中的System.Drawing.Bitmap?將System.Windows.Media.ImageSource轉換爲System.Drawing.Bitmap
回答
請參閱HOW TO USE IMAGESOURCE (NO HANDLER) IN WINFORMS AS SYSTEM.DRAWING.BITMAP (HBITMAP):
如何輕鬆轉換的WinForms System.Drawing.Bitmap到WPF 您的ImageSource從這個 文章教訓。今天,我將解釋如何做 它與此相反。其實,所有他必須 要做的就是從 的BitmapSource提取處理,然而,這樣的做法 不支持,因此唯一 我們能做的也只是 的BitmapSource(或BitmapFrame)的像素複製到 字節數組,然後將它們複製到HBitmap的指針 中。
其較舊的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);
}
如果您需要使用Alpha通道(使用透明部分)轉換圖像,請使用System.Windows.Media.Imaging.PngBitmapEncoder()而不是System.Windows.Media.Imaging.BmpBitmapEncoder()。 – 2014-11-03 10:42:08
@DariuszWasacz我無法得到這個工作的答案。它抱怨image.Source不起作用:**'System.Drawing.Image'不包含'Source'的定義,並且沒有接受'System.Drawing.Image'類型的第一個參數的擴展方法'Source'可能是發現。** 我檢查了MSDN,並且圖像沒有Source屬性。你有什麼想法需要解決的? – 2015-02-11 23:20:09
@kayleeFrye_onDeck:請注意,System.Drawing和System.Windows.Media命名空間都包含類'Image'。它看起來像是在參數'System.Windows.Media.Image image'中省略了命名空間,而'System.Drawing.Image'是從使用語句中取得的。請檢查您的代碼是否與上述完全相同。 – 2015-02-16 08:02:25
- 1. 將System.Windows.Media.ImageSource轉換爲ByteArray
- 2. 將Gdk.Pixbuf轉換爲System.Drawing.Bitmap?
- 3. 將System.windows.Controls.Image轉換爲System.Drawing.Bitmap
- 4. C# - 將WPF Image.source轉換爲System.Drawing.Bitmap
- 5. 將類型'System.Drawing.Bitmap'轉換爲'Emgu.CV.IImage'
- 6. 如何在C#中將'system.windows.media.imagesource'類型轉換爲'system.drawing.image'或byte []?
- 7. WPF不能隱式地將system.drawing.bitmap轉換爲media.brush
- 8. 當我將System.Drawing.Bitmap對象轉換爲cv :: Mat
- 9. 無法隱式轉換類型「爲System.Drawing.Image」到「System.Drawing.Bitmap'`
- 10. 無法從類型「<null>」轉換'<null>爲鍵入「System.Windows.Media.ImageSource」
- 11. 將MS Access.adp轉換爲ASP.Net轉換:DLookup轉換爲SQL
- 12. 將值轉換爲%
- 13. 將PeriodIndex轉換爲
- 14. 序列化System.Windows.Media.ImageSource對象
- 15. 將ISML PAC轉換爲XForm轉換
- 16. 將VB6代碼轉換爲PHP轉換
- 17. 將3D轉換轉換爲2D
- 18. 將XML轉換,轉換爲屬性
- 19. 將HTML轉換爲Google文檔轉換
- 20. 將VB轉換爲C#類型轉換
- 21. 將DataRow []轉換爲DataTable的ASP.NET轉換
- 22. 將數據轉換爲數字轉換
- 23. 將json轉換爲數組php將數組轉換爲字符串轉換
- 24. 將表格轉換爲html並將其轉換爲div
- 25. FLEX XMLDecoder將`09.00`轉換爲「09.00」,但將`10.00`轉換爲10
- 26. 將XML轉換爲XML,將屬性轉換爲元素
- 27. 將OCaml轉換爲F#:將OCaml open_box和close_box轉換爲F#
- 28. 將NSData轉換爲base64encoded並將字節數組轉換爲C#
- 29. *將char轉換爲main並將* char轉換爲struct
- 30. 將C++轉換爲python - 將memcpy uchar轉換爲int64
之前削減圖像尺寸兩者這和以前的職位是相同的方法:複製位圖的掃描線的字節數組,然後從內存塊創建一個位圖。位圖假定存儲器塊在位圖生存期中包含掃描行。但是,在離開固定(byte * pB = bits)代碼後,內存可能會被.net內存管理器覆蓋,並且位圖被損壞。解決方案是使用Marshal.AllocHGlobal,但在這種情況下,內存塊必須由用戶代碼維護(即:必須在Marshal.FreeHGlobal使用後釋放)。 – 2014-11-03 11:12:30