2009-07-13 14 views

Odpowiedz

16

Możesz użyć właściwości Źródło obrazu. Wypróbuj ten kod ...

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

image1.Source = imageSource; 
+38

Ma już bitmapę w pamięci, więc nie może korzystać z URI –

+0

Mam obiekt Bitmap, faktycznie jest on generowany z urządzenia skanującego, więc nie mogę odnieść się do żadnej lokalizacji –

+0

Mam metodę, która zwraca obraz bitmapowy .. jak ustawić go jako źródło –

83

Według 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; 
    } 

Robi System.Drawing.Bitmap (od WindowsBased) i zamienia go na BitmapSource, który w rzeczywistości może być wykorzystywane jako źródła obrazu do kontroli obrazu w WPF.

image1.Source = YourUtilClass.loadBitmap(SomeBitmap); 
+7

Thx Lars, ale zrobiłem znacznie prostsze, BitmapImage bmpi = new BitmapImage(); bmpi.BeginInit(); bmpi.StreamSource = new MemoryStream (ByteArray); bmpi.EndInit(); image1.Source = bmpi; –

+3

Świetnie. Możesz dodać swoje rozwiązanie jako odpowiedź na własne pytanie. –

+0

Nie widzę metody BitmapImage.StreamSource. Prashant, wpisałeś coś źle? –

16

Jest to łatwe dla pliku dysku, ale trudniejsze dla Bitmapy w pamięci.

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; 

Stealed here

+0

Thx, ale kod nie zamknął ms.I think you will use http://stackoverflow.com/a/1069509/6116637 – lindexi

+0

@lindexi Mimo że 'MemoryStream' implementuje' IDisposable', to nie wymaga jawnego udostępniania, ponieważ nie zawija żadnego niezarządzanego zasobu. To jest jak tablica bajtów i ostatecznie zostanie zebrane przez GC. – kennyzx

2

Napisałem program z wpf i używany do wyświetlania obrazów bazy danych i jest to mój kod:

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

Dobra odpowiedź, ale zdecydowanie zaleca się zawijanie obiektów Sql przy użyciu instrukcji, więc są one usuwane po zakończeniu ich używania. –

Powiązane problemy