He encontrado un montón de gente que convierte un BitmapSource
en un Bitmap
, pero ¿qué pasa con ImageSource
a Bitmap
? Estoy creando un programa de imágenes y necesito extraer mapas de bits de la imagen que se muestra en el elemento Image
. ¿Alguien sabe como hacer esto?C# - Convierte WPF Image.source a System.Drawing.Bitmap
EDIT 1:
Esta es una función para convertir la BitmapImage
a un Bitmap
. Recuerde establecer la opción 'inseguro' en las preferencias del compilador.
public static System.Drawing.Bitmap BitmapSourceToBitmap(BitmapSource srs)
{
System.Drawing.Bitmap btm = null;
int width = srs.PixelWidth;
int height = srs.PixelHeight;
int stride = width * ((srs.Format.BitsPerPixel + 7)/8);
byte[] bits = new byte[height * stride];
srs.CopyPixels(bits, stride, 0);
unsafe
{
fixed (byte* pB = bits)
{
IntPtr ptr = new IntPtr(pB);
btm = new System.Drawing.Bitmap(width, height, stride, System.Drawing.Imaging.PixelFormat.Format1bppIndexed, ptr);
}
}
return btm;
}
siguiente es ahora para obtener un BitmapImage
:
RenderTargetBitmap targetBitmap = new RenderTargetBitmap(
(int)inkCanvas1.ActualWidth,
(int)inkCanvas1.ActualHeight,
96d, 96d,
PixelFormats.Default);
targetBitmap.Render(inkCanvas1);
MemoryStream mse = new MemoryStream();
System.Windows.Media.Imaging.BmpBitmapEncoder mem = new BmpBitmapEncoder();
mem.Frames.Add(BitmapFrame.Create(targetBitmap));
mem.Save(mse);
mse.Position = 0;
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = mse;
bi.EndInit();
siguiente es convertirlo:
Bitmap b = new Bitmap(BitmapSourceToBitmap(bi));
Tenga en cuenta que internamente, este constructor de 'Bitmap' llama' GdipCreateBitmapFromScan0', que espera que el usuario libere la memoria cuando ya no es necesaria ... – Cameron
@Cameron, buen punto. Edité mi respuesta para tener eso en cuenta. –
Desafortunadamente, la memoria no puede liberarse hasta después de que se haya eliminado el System.Drawing.Bitmap (No puedo encontrar ningún documento sobre esto, pero después de probarlo en una aplicación de interoperabilidad, mis imágenes solo aparecen correctamente si gratis después, por lo que no parece que está copiando los datos internamente). Además, los [documentos de GDI] (http://www.jose.it-berater.org/gdiplus/reference/flatapi/bitmap/gdipcreatebitmapfromscan0.htm) parecen requerir que la zancada sea un múltiplo de 4; entonces '(srs.Format.BitsPerPixel + 7)/8' debería ser' (srs.Format.BitsPerPixPeel + 31)/32 * 8', creo. – Cameron