2009-07-29 97 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