Використання керування зображеннями у WPF для відображення System.Drawing.Bitmap


77

Як призначити об’єкт у пам’яті Bitmapелементу Imageкерування у WPF?


Точний дублікат stackoverflow.com/questions/94456/…, але моя відповідь не протікає HBitmap
Ларс Труйенс

Це відповідає на ваше запитання? Завантажте WPF BitmapImage із System.Drawing.Bitmap
UuDdLrLrSs

Відповіді:


17

Ви можете використовувати властивість Source зображення. Спробуйте цей код ...

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

image1.Source = imageSource;

1
У мене є Bitmap-об'єкт, насправді він генерується із скануючого пристрою, тому я не можу посилатися на будь-яке місце
Прашант Чолачагудда,

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.

image1.Source = YourUtilClass.loadBitmap(SomeBitmap);

7
Thx Ларс, але я зробив набагато простіше, BitmapImage bmpi = new BitmapImage (); bmpi.BeginInit (); bmpi.StreamSource = новий MemoryStream (ByteArray); bmpi.EndInit (); image1.Source = bmpi;
Прашант Чолачагудда,

4
Чудово. Ви можете додати своє рішення як відповідь на власне запитання.
Ларс Труйенс,

Я не бачу методу BitmapImage.StreamSource. Прашант, ти щось неправильно набрав?
Патрік Салапський,

Або власність.
Патрік Салапський,

4
При використанні некерованих ручки (наприклад , HBITMAP) розглянути питання про використання SafeHandles см stackoverflow.com/questions/1546091 / ...
Джек Ukleja

16

Це легко для файлу на диску, але важче для Bitmap в пам'яті.

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;

Тут вкрали


Thx, але код не закрив ms.I думає , що ви будете використовувати 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
Хороша відповідь, але я настійно рекомендую обернути об'єкти Sql у оператори, щоб вони були видалені, коли ви закінчите їх використання.
Моріс Рівз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.