Verwenden der Bildsteuerung in WPF zum Anzeigen von System.Drawing.Bitmap


Antworten:


17

Sie können die Source-Eigenschaft des Bildes verwenden. Versuchen Sie diesen Code ...

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

image1.Source = imageSource;

1
Ich habe ein Bitmap-Objekt, das tatsächlich von einem Scan-Gerät generiert wird, daher kann ich mich nicht auf einen Ort beziehen
Prashant Cholachagudda

86

Laut 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;
   }

Es ruft System.Drawing.Bitmap (von WindowsBased) ab und konvertiert es in BitmapSource, die tatsächlich als Bildquelle für Ihr Bildsteuerelement in WPF verwendet werden kann.

image1.Source = YourUtilClass.loadBitmap(SomeBitmap);

7
Danke Lars, aber ich habe es viel einfacher gemacht, BitmapImage bmpi = new BitmapImage (); bmpi.BeginInit (); bmpi.StreamSource = neuer MemoryStream (ByteArray); bmpi.EndInit (); image1.Source = bmpi;
Prashant Cholachagudda

4
Großartig. Sie können Ihre Lösung als Antwort auf Ihre eigene Frage hinzufügen.
Lars Truijens

Ich sehe keine BitmapImage.StreamSource-Methode. Prashant, hast du etwas falsch geschrieben?
Patrick Szalapski

Oder eine Immobilie.
Patrick Szalapski

4
Wenn Sie nicht verwaltete Handles (z. B. HBITMAP) verwenden, sollten Sie SafeHandles verwenden, siehe stackoverflow.com/questions/1546091/…
Jack Ukleja

16

Es ist einfach für Festplattendateien, aber schwieriger für Bitmap im Speicher.

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;

Hier gestohlen


Thx, aber der Code hat die MS nicht geschlossen. Ich denke, Sie werden stackoverflow.com/a/1069509/6116637
lindexi

@lindexi Obwohl MemoryStreamimplementiert IDisposable, muss es nicht explizit entsorgt werden, da es keine nicht verwalteten Ressourcen umschließt . Es ist wie ein Byte-Array und wird schließlich von GC gesammelt.
Kennyzx

2

Ich habe ein Programm mit geschrieben wpfund die Datenbank zum Anzeigen von Bildern verwendet. Dies ist mein 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;

2
Gute Antwort, aber ich würde dringend empfehlen, die SQL-Objekte mit Anweisungen zu versehen, damit sie entsorgt werden, wenn Sie sie nicht mehr verwenden.
Maurice Reeves
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.