How do I assign an in-memory Bitmap object to an Image control in WPF ?
-
Exact duplicate of stackoverflow.com/questions/94456/… but my answer does not leak HBitmapLars Truijens– Lars Truijens2009-07-13 11:55:24 +00:00Commented Jul 13, 2009 at 11:55
-
Does this answer your question? Load a WPF BitmapImage from a System.Drawing.BitmapStayOnTarget– StayOnTarget2020-02-04 17:25:17 +00:00Commented Feb 4, 2020 at 17:25
Add a comment
|
4 Answers
According to 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;
}
It gets System.Drawing.Bitmap (from WindowsBased) and converts it into BitmapSource, which can be actually used as image source for your Image control in WPF.
image1.Source = YourUtilClass.loadBitmap(SomeBitmap);
7 Comments
Prashant Cholachagudda
Thx Lars, but I did much simpler, BitmapImage bmpi = new BitmapImage(); bmpi.BeginInit(); bmpi.StreamSource = new MemoryStream(ByteArray); bmpi.EndInit(); image1.Source = bmpi;
Lars Truijens
Great. You can add your sollution as an answer to your own question.
Patrick Szalapski
I do not see a BitmapImage.StreamSource method. Prashant, did you type something wrong?
Patrick Szalapski
Or a property, for that matter.
Jack Ukleja
When using unmanaged handles (e.g. HBITMAP) consider using SafeHandles, see stackoverflow.com/questions/1546091/…
|
You can use the Source property of the image. Try this code...
ImageSource imageSource = new BitmapImage(new Uri("C:\\FileName.gif"));
image1.Source = imageSource;
1 Comment
Prashant Cholachagudda
I have Bitmap object, actully it is generated from a scan device, so I cant refer to any location
It's easy for disk file, but harder for Bitmap in memory.
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;
2 Comments
lindexi
Thx,but the code have not closed the ms.I think you will use stackoverflow.com/a/1069509/6116637
kennyzx
@lindexi Even though
MemoryStream implements IDisposable, it does not require to be disposed explicitly since it does not wrap any unmanaged resource. It is like a byte array and will eventually get collected by GC.I wrote a program with wpf and used Database for showing images and this is my code:
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;
1 Comment
Maurice Reeves
Good answer, but I would highly recommend wrapping the Sql objects in using statements so they're disposed when you're done using them.