在WPF中使用Image控件显示System.Drawing.Bitmap


Answers:


17

您可以使用图像的Source属性。试试这个代码...

ImageSource imageSource = new BitmapImage(new Uri("C:\\FileName.gif"));

image1.Source = imageSource;

1
我有位图对象,实际上是从扫描设备生成的,所以我无法引用任何位置
Prashant Cholachagudda 09年

86

根据http://khason.net/blog/how-to-use-systemdrawingbitmap-hbitmap-in-wpf/

   [DllImport("gdi32")]
   static extern int DeleteObject(IntPtr o);

   public static BitmapSource loadBitmap(System.Drawing.Bitmap source)
   {
       IntPtr ip = source.GetHbitmap();
       BitmapSource bs = null;
       try
       {
           bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip, 
              IntPtr.Zero, Int32Rect.Empty, 
              System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
       }
       finally
       {
           DeleteObject(ip);
       }

       return bs;
   }

它获取System.Drawing.Bitmap(来自WindowsBased),并将其转换为BitmapSource,它实际上可用作WPF中Image控件的图像源。

image1.Source = YourUtilClass.loadBitmap(SomeBitmap);

7
Thx Lars,但我做的简单得多,BitmapImage bmpi = new BitmapImage(); bmpi.BeginInit(); bmpi.StreamSource =新的MemoryStream(ByteArray); bmpi.EndInit(); image1.Source = bmpi;
Prashant Cholachagudda,2009年

4
大。您可以将解决方案添加为您自己的问题的答案。
Lars Truijens 09年

我没有看到BitmapImage.StreamSource方法。Prashant,您输入的内容有误吗?
Patrick Szalapski 09年

或财产,就此而言。
Patrick Szalapski 09年

4
当使用非托管的句柄(如HBITMAP)使用SafeHandles考虑,看stackoverflow.com/questions/1546091/...
杰克Ukleja

16

对于磁盘文件来说很容易,但是对于内存中的位图则更难。

System.Drawing.Bitmap bmp;
Image image;
...
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Position = 0;
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();

image.Source = bi;

偷在这里


谢谢,但是代码还没有关闭ms。我想你会用stackoverflow.com/a/1069509/6116637
lindexi

@lindexi即使MemoryStream实现IDisposable,也不需要显式处理它,因为它不会包装任何非托管资源。它就像一个字节数组,最终将由GC收集。
kennyzx

2

我编写了一个程序,wpf并使用数据库来显示图像,这是我的代码:

SqlConnection con = new SqlConnection(@"Data Source=HITMAN-PC\MYSQL;
                                      Initial Catalog=Payam;
                                      Integrated Security=True");

SqlDataAdapter da = new SqlDataAdapter("select * from news", con);

DataTable dt = new DataTable();
da.Fill(dt);

string adress = dt.Rows[i]["ImgLink"].ToString();
ImageSource imgsr = new BitmapImage(new Uri(adress));
PnlImg.Source = imgsr;

2
很好的答案,但是我强烈建议在using语句中包装Sql对象,以便在使用完它们后将它们丢弃。
莫里斯·里夫斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.