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.
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.
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);
Podoba mi się to rozwiązanie! Dziękuje! –
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
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"/>
Samodzielny. lubię to – Basic
prawdopodobnie związane: http://stackoverflow.com/questions/1118496/using-image-control-in-wpf-to-display-system-drawing-bitmap – Alain
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) –