2012-04-09 25 views
19

Mam wystąpienie System.Drawing.Image.Pokaż rysunek.Image w WPF

Jak mogę to pokazać w mojej aplikacji WPF?

Próbowałem z img.Source, ale to nie działa.

+0

prawdopodobnie związane: http://stackoverflow.com/questions/1118496/using-image-control-in-wpf-to-display-system-drawing-bitmap – Alain

+3

Możliwy duplikat [WPF - czy mogę używać System.Drawing w wpf?] (Http://stackoverflow.com/questions/10663056/wpf-can-i-use-system-drawing-in-wpf) –

Odpowiedz

14

Aby załadować obraz do kontrolki obrazu WPF, potrzebny jest System.Windows.Media.ImageSource.

trzeba konwertować obiekt Drawing.Image do obiektu ImageSource:

public static BitmapSource GetImageStream(Image myImage) 
    { 
     var bitmap = new Bitmap(myImage); 
     IntPtr bmpPt = bitmap.GetHbitmap(); 
     BitmapSource bitmapSource = 
     System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
       bmpPt, 
       IntPtr.Zero, 
       Int32Rect.Empty, 
       BitmapSizeOptions.FromEmptyOptions()); 

     //freeze bitmapSource and clear memory to avoid memory leaks 
     bitmapSource.Freeze(); 
     DeleteObject(bmpPt); 

     return bitmapSource; 
    } 

Deklarację metody DeleteObject.

[DllImport("gdi32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
internal static extern bool DeleteObject(IntPtr value); 
+0

Podoba mi się to rozwiązanie! Dziękuje! –

19

Mam ten sam problem i rozwiązać go, łącząc kilka odpowiedzi.

System.Drawing.Bitmap bmp; 
Image image; 
... 
using (var ms = new MemoryStream()) 
{ 
    bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
    ms.Position = 0; 

    var bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.CacheOption = BitmapCacheOption.OnLoad; 
    bi.StreamSource = ms; 
    bi.EndInit(); 
} 

image.Source = bi; 
//bmp.Dispose(); //if bmp is not used further. Thanks @Peter 

Od this question and answers

+2

+1 Ładne i uporządkowane – GETah

+0

Nie zapomnij wyrzucić "bmp". – Peter

+0

co to jest ** bmp ** użyte w tym przykładzie? – juagicre

9

Jeśli używasz konwertera, można rzeczywiście wiążą się z obiektu Image. Po prostu musisz utworzyć IValueConverter, który przekształci Image w BitmapSource.

Użyłem przykładowego kodu AlexDrenea wewnątrz konwertera, aby wykonać prawdziwą pracę.

[ValueConversion(typeof(Image), typeof(BitmapSource))] 
public class ImageToBitmapSourceConverter : IValueConverter 
{ 
    [DllImport("gdi32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool DeleteObject(IntPtr value); 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Image myImage = (Image)value; 

     var bitmap = new Bitmap(myImage); 
     IntPtr bmpPt = bitmap.GetHbitmap(); 
     BitmapSource bitmapSource = 
     System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
       bmpPt, 
       IntPtr.Zero, 
       Int32Rect.Empty, 
       BitmapSizeOptions.FromEmptyOptions()); 

     //freeze bitmapSource and clear memory to avoid memory leaks 
     bitmapSource.Freeze(); 
     DeleteObject(bmpPt); 

     return bitmapSource; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

W swoim XAML trzeba będzie dodać konwerter.

<utils:ImageToBitmapSourceConverter x:Key="ImageConverter"/> 

<Image Source="{Binding ThumbSmall, Converter={StaticResource ImageConverter}}" 
        Stretch="None"/> 
+0

Samodzielny. lubię to – Basic