c# wpf bitmap type-conversion imagesource

treeview wpf c#



WPF-convertir Bitmap a ImageSource (5)

Necesito convertir un System.Drawing.Bitmap en la clase System.Windows.Media.ImageSource para enlazarlo en un control HeaderImage de WizardPage (kit de herramientas WPF extendido). El mapa de bits se establece como un recurso del conjunto que escribo. Se está haciendo referencia así:

public Bitmap GetBitmap { get { Bitmap bitmap = new Bitmap(Resources.my_banner); return bitmap; } } public ImageSource HeaderBitmap { get { ImageSourceConverter c = new ImageSourceConverter(); return (ImageSource) c.ConvertFrom(GetBitmap); } }

El convertidor lo encontré aquí: http://www.codeproject.com/Questions/621920/How-to-convert-Bitmap-to-ImageSource Obtengo una NullReferenceException en

return (ImageSource) c.ConvertFrom(Resources.my_banner); ¿Cómo puedo inicializar ImageSource para evitar esta excepción? ¿O hay otra manera? Quiero usarlo después como:

<xctk:WizardPage x:Name="StartPage" Height="500" Width="700" HeaderImage="{Binding HeaderBitmap}" Enter="StartPage_OnEnter"

Gracias de antemano por cualquier respuesta.


La solución más simple para mí:

ImageBrush myBrush = new ImageBrush(); var bitmap = System.Drawing.Image.FromFile("pic1.bmp"); Bitmap bitmap = new System.Drawing.Bitmap(image);//it is in the memory now var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(),IntPtr.Zero,Int32Rect.Empty,BitmapSizeOptions.FromEmptyOptions()); myBrush.ImageSource = bitmapSource; cover.MainGrid.Background = myBrush; cover.Show(); bitmap.Dispose();


No creo que ImageSourceConverter se convierta de un System.Drawing.Bitmap . Sin embargo, puedes usar lo siguiente:

public static BitmapSource CreateBitmapSourceFromGdiBitmap(Bitmap bitmap) { if (bitmap == null) throw new ArgumentNullException("bitmap"); var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); var bitmapData = bitmap.LockBits( rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); try { var size = (rect.Width * rect.Height) * 4; return BitmapSource.Create( bitmap.Width, bitmap.Height, bitmap.HorizontalResolution, bitmap.VerticalResolution, PixelFormats.Bgra32, null, bitmapData.Scan0, size, bitmapData.Stride); } finally { bitmap.UnlockBits(bitmapData); } }

Esta solución requiere que la imagen de origen esté en formato Bgra32; Si está tratando con otros formatos, es posible que deba agregar una conversión.


Para beneficio de los buscadores, creé un convertidor rápido basado en una solución más detallada .

No hay problemas hasta ahora.

using System; using System.Drawing; using System.IO; using System.Windows.Media.Imaging; namespace XYZ.Helpers { public class ConvertBitmapToBitmapImage { /// <summary> /// Takes a bitmap and converts it to an image that can be handled by WPF ImageBrush /// </summary> /// <param name="src">A bitmap image</param> /// <returns>The image as a BitmapImage for WPF</returns> public BitmapImage Convert(Bitmap src) { MemoryStream ms = new MemoryStream(); ((System.Drawing.Bitmap)src).Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); BitmapImage image = new BitmapImage(); image.BeginInit(); ms.Seek(0, SeekOrigin.Begin); image.StreamSource = ms; image.EndInit(); return image; } } }


Para otros, esto funciona:

//If you get ''dllimport unknown''-, then add ''using System.Runtime.InteropServices;'' [DllImport("gdi32.dll", EntryPoint = "DeleteObject")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DeleteObject([In] IntPtr hObject); public ImageSource ImageSourceForBitmap(Bitmap bmp) { var handle = bmp.GetHbitmap(); try { return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } finally { DeleteObject(handle); } }


dethSwatch - ¡Gracias por tu respuesta! ¡Ayudó tremendamente! Después de implementarlo obtuve el comportamiento deseado, pero descubrí que tenía un problema de memoria / manejo en otra sección de mi programa. Cambié el código de la siguiente manera, haciéndolo un poco más detallado y el problema desapareció. ¡Gracias de nuevo!

[DllImport("gdi32.dll", EntryPoint = "DeleteObject")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DeleteObject([In] IntPtr hObject); public ImageSource ImageSourceForBitmap(Bitmap bmp) { var handle = bmp.GetHbitmap(); try { ImageSource newSource = Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); DeleteObject(handle); return newSource; } catch (Exception ex) { DeleteObject(handle); return null; } }