Load a WPF BitmapImage from a System.Drawing.Bitmap Load a WPF BitmapImage from a System.Drawing.Bitmap wpf wpf

Load a WPF BitmapImage from a System.Drawing.Bitmap


How about loading it from MemoryStream?

using(MemoryStream memory = new MemoryStream()){    bitmap.Save(memory, ImageFormat.Png);    memory.Position = 0;    BitmapImage bitmapImage = new BitmapImage();    bitmapImage.BeginInit();    bitmapImage.StreamSource = memory;    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;    bitmapImage.EndInit();}


Thanks to Hallgrim, here is the code I ended up with:

ScreenCapture = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(   bmp.GetHbitmap(),    IntPtr.Zero,    System.Windows.Int32Rect.Empty,    BitmapSizeOptions.FromWidthAndHeight(width, height));

I also ended up binding to a BitmapSource instead of a BitmapImage as in my original question


I know this has been answered, but here are a couple of extension methods (for .NET 3.0+) that do the conversion. :)

        /// <summary>    /// Converts a <see cref="System.Drawing.Image"/> into a WPF <see cref="BitmapSource"/>.    /// </summary>    /// <param name="source">The source image.</param>    /// <returns>A BitmapSource</returns>    public static BitmapSource ToBitmapSource(this System.Drawing.Image source)    {        System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(source);        var bitSrc = bitmap.ToBitmapSource();        bitmap.Dispose();        bitmap = null;        return bitSrc;    }    /// <summary>    /// Converts a <see cref="System.Drawing.Bitmap"/> into a WPF <see cref="BitmapSource"/>.    /// </summary>    /// <remarks>Uses GDI to do the conversion. Hence the call to the marshalled DeleteObject.    /// </remarks>    /// <param name="source">The source bitmap.</param>    /// <returns>A BitmapSource</returns>    public static BitmapSource ToBitmapSource(this System.Drawing.Bitmap source)    {        BitmapSource bitSrc = null;        var hBitmap = source.GetHbitmap();        try        {            bitSrc = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(                hBitmap,                IntPtr.Zero,                Int32Rect.Empty,                BitmapSizeOptions.FromEmptyOptions());        }        catch (Win32Exception)        {            bitSrc = null;        }        finally        {            NativeMethods.DeleteObject(hBitmap);        }        return bitSrc;    }

and the NativeMethods class (to appease FxCop)

    /// <summary>/// FxCop requires all Marshalled functions to be in a class called NativeMethods./// </summary>internal static class NativeMethods{    [DllImport("gdi32.dll")]    [return: MarshalAs(UnmanagedType.Bool)]    internal static extern bool DeleteObject(IntPtr hObject);}