如何将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. C# - 将WPF Image.source转换为System.Drawing.Bitmap
- 4. 将类型'System.Drawing.Bitmap'转换为'Emgu.CV.IImage'
- 5. 如何在C#中将'system.windows.media.imagesource'类型转换为'system.drawing.image'或byte []?
- 6. 当我将System.Drawing.Bitmap对象转换为cv :: Mat
- 7. 无法隐式转换类型“为System.Drawing.Image”到“System.Drawing.Bitmap'`
- 8. 无法从类型“<null>”转换'<null>为键入“System.Windows.Media.ImageSource”
- 9. 将MS Access.adp转换为ASP.Net转换:DLookup转换为SQL
- 10. 将PeriodIndex转换为
- 11. 将值转换为%
- 12. 将ISML PAC转换为XForm转换
- 13. 将VB转换为C#类型转换
- 14. 将DataRow []转换为DataTable的ASP.NET转换
- 15. FLEX XMLDecoder将`09.00`转换为“09.00”,但将`10.00`转换为10
- 16. 将XML转换为XML,将属性转换为元素
- 17. XNA.Texture2D到System.Drawing.Bitmap
- 18. 绘制新System.Drawing.Bitmap
- 19. System.Drawing.Bitmap GetBounds GraphicsUnit.Inch
- 20. WPF:System.Windows.Interop.InteropBitmap到System.Drawing.Bitmap
- 21. 序列化System.Windows.Media.ImageSource对象
- 22. 将int转换为char
- 23. 将markdown转换为reStructuredtest?
- 24. 将curl转换为PHP
- 25. 将DataSet \ DataTable转换为CSV
- 26. 将网址转换为NSData
- 27. 将SVG dataUrl转换为base64
- 28. 将MySql表转换为BerkelyDB
- 29. 将RxJS Observable转换为Promise
- 30. 将PDF转换为PostScript
之前削减图像尺寸两者这和以前的职位是相同的方法:复制位图的扫描线的字节数组,然后从内存块创建一个位图。位图假定存储器块在位图生存期中包含扫描行。但是,在离开固定(byte * pB = bits)代码后,内存可能会被.net内存管理器覆盖,并且位图被损坏。解决方案是使用Marshal.AllocHGlobal,但在这种情况下,内存块必须由用户代码维护(即:必须在Marshal.FreeHGlobal使用后释放)。 – 2014-11-03 11:12:30