2009-07-29 75 views

Respuesta

1

Por favor, vea HOW TO USE IMAGESOURCE (NO HANDLER) IN WINFORMS AS SYSTEM.DRAWING.BITMAP (HBITMAP):

Cómo convertir fácilmente WinForms System.Drawing.Bitmap en WPF ImageSource que ha aprendido de este artículo. Hoy, explicaré cómo hacerlo contrario. En realidad, lo único que tienen que hacer es extraer manejador de BitmapSource, sin embargo, este enfoque no es compatible, por lo tanto lo único podemos hacer es copiar píxeles de BitmapSource (o BitmapFrame) en una matriz bytes y luego cópialos en el puntero de HBitmap.

+0

Tanto ésta como mensajes anteriores son el mismo enfoque: copiar líneas de exploración de mapa de bits a una matriz de bytes y luego crea un mapa de bits desde el bloque de memoria. El mapa de bits supone que el bloque de memoria contiene líneas de exploración durante la vida útil del mapa de bits. Sin embargo, después de dejar el código fijo (byte * pB = bits), la memoria puede ser sobrescrita por el administrador de memoria .net y el mapa de bits se corrompe. La solución es utilizar Marshal.AllocHGlobal, pero en este caso el bloque de memoria debe mantenerse por código de usuario (es decir: debe ser liberado después de su uso por Marshal.FreeHGlobal). –

9

es un OP anterior, pero aún así puede ser útil para otras personas, ya que llevó algún tiempo encontrar una solución más limpia sin interoperabilidad de dll o cortes de portapapeles.

Esto funcionó para mí, puede utilizar pngencoder para cortar el tamaño de la imagen antes de guardar en un archivo o secuencia RTF

private System.Drawing.Image ImageWpfToGDI(System.Windows.Media.ImageSource image) { 
    MemoryStream ms = new MemoryStream(); 
    var encoder = new System.Windows.Media.Imaging.BmpBitmapEncoder(); 
    encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(image as System.Windows.Media.Imaging.BitmapSource)); 
    encoder.Save(ms); 
    ms.Flush();  
    return System.Drawing.Image.FromStream(ms); 
} 
+0

Si necesita convertir imágenes con canal alfa (con partes transparentes), use System.Windows.Media.Imaging.PngBitmapEncoder() en lugar de System.Windows.Media.Imaging.BmpBitmapEncoder(). –

+0

@DariuszWasacz No puedo hacer que esta respuesta funcione. Se queja de que image.Source no funciona: ** 'System.Drawing.Image' no contiene una definición para 'Source' y ningún método de extensión 'Source' que acepte un primer argumento de tipo 'System.Drawing.Image' podría ser encontrado. ** Revisé MSDN e Imagen no tiene una propiedad de Fuente. ¿Tienes alguna idea de lo que necesita ser arreglado? –

+1

@kayleeFrye_onDeck: tenga en cuenta que los espacios de nombres System.Drawing y System.Windows.Media contienen la clase 'Imagen'. Parece que omitió el espacio de nombres en el argumento 'System.Windows.Media.Image image' y 'System.Drawing.Image' se tomó de las instrucciones de uso. Por favor, compruebe si su código es exactamente el mismo que el anterior. –