2012-04-09 36 views
19

Tôi đã có một phiên bản System.Drawing.Image.Hiển thị bản vẽ. Hình ảnh trong WPF

Tôi làm cách nào để hiển thị điều này trong ứng dụng WPF của mình?

Tôi đã thử với img.Source nhưng điều đó không hoạt động.

+0

Có thể liên quan: http://stackoverflow.com/questions/1118496/using-image-control-in-wpf-to-display-system-drawing-bitmap – Alain

+3

trùng lặp có thể xảy ra của [WPF - Tôi có thể sử dụng System.Drawing in wpf?] (Http://stackoverflow.com/questions/10663056/wpf-can-i-use-system-drawing-in-wpf) –

Trả lời

14

Để tải một hình ảnh vào một điều khiển hình ảnh WPF, bạn sẽ cần một System.Windows.Media.ImageSource.

Bạn cần phải chuyển đổi đối tượng Drawing.Image của bạn đến một đối tượng 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; 
    } 

Tuyên bố của phương pháp DeleteObject.

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

Tôi thích giải pháp này! Cảm ơn bạn! –

19

Tôi có cùng một vấn đề và giải quyết bằng cách kết hợp một số câu trả lời.

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 

Từ this question and answers

+2

+1 Đẹp và gọn gàng – GETah

+0

Đừng quên vứt bỏ 'bmp'. – Peter

+0

** bmp ** được sử dụng trong ví dụ này là gì? – juagicre

9

Nếu bạn sử dụng một bộ chuyển đổi, bạn thực sự có thể liên kết với các đối tượng Image. Bạn chỉ cần tạo một IValueConverter để chuyển đổi Image thành BitmapSource.

Tôi đã sử dụng mã mẫu của AlexDrenea bên trong trình biến đổi để thực hiện công việc thực.

[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(); 
    } 
} 

Trong XAML, bạn cần phải thêm bộ chuyển đổi.

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

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

Tự chứa. tôi thích nó – Basic

Các vấn đề liên quan