2011-12-29 23 views
7

He estado usando una aplicación WPF que utiliza BitmapSource pero necesito hacer alguna manipulación pero necesito hacer algo de manipulación de System.Drawing.Bitmaps.Fuga de memoria no administrada

El uso de memoria de la aplicación aumenta mientras se ejecuta.

que han reducido la pérdida de memoria a este código:

private BitmapSource BitmaptoBitmapsource(System.Drawing.Bitmap bitmap) 
{ 
      BitmapSource bms; 
      IntPtr hBitmap = bitmap.GetHbitmap(); 
      BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions(); 
      bms = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, sizeOptions); 
      bms.Freeze(); 
      return bms; 
} 

supongo que es la memoria no administrada no se eliminan adecuadamente, pero me parece que no puede encontrar modos de hacerlo manualmente. ¡Gracias de antemano por cualquier ayuda!

Alex

+0

posible duplicado de [pérdida de memoria WPF CreateBitmapSourceFromHBitmap] (http://stackoverflow.com/questions/1546091/wpf-createbitmapsourcefromhbitmap-memory-leak) – Pieniadz

Respuesta

9

necesita llamar DeleteObject(...) en su hBitmap. Ver: http://msdn.microsoft.com/en-us/library/1dz311e4.aspx

private BitmapSource BitmaptoBitmapsource(System.Drawing.Bitmap bitmap) 
{ 
    BitmapSource bms; 
    IntPtr hBitmap = bitmap.GetHbitmap(); 
    BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions(); 
    bms = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, 
     IntPtr.Zero, Int32Rect.Empty, sizeOptions); 
    bms.Freeze(); 

    // NEW: 
    DeleteObject(hBitmap); 

    return bms; 
} 
+3

yo estaba a punto de escribir exactamente la misma respuesta;) Aquí está la declaración del método 'DeleteObject': ' [DllImport ("gdi32.dll")] static ext bool DeleteObject (IntPtr hObject); ' – ken2k

+0

@ ken2k: y estaba a punto de agregar exactamente la misma declaración. ¡Gracias! – MusiGenesis

+0

¡Muchas gracias, eso resuelve mi problema! – aforward

4

es necesario llamar a DeleteObject(hBitmap) en el hBitmap:

private BitmapSource BitmaptoBitmapsource(System.Drawing.Bitmap bitmap) { 
     BitmapSource bms; 
     IntPtr hBitmap = bitmap.GetHbitmap(); 
     BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions(); 
     try { 
      bms = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, sizeOptions); 
      bms.Freeze(); 
     } finally { 
      DeleteObject(hBitmap); 
     } 
     return bms; 
} 
0

¿Está liberando el controlador de mapa de bits?

De acuerdo con MSDN (http://msdn.microsoft.com/en-us/library/1dz311e4.aspx)

Usted es responsable de llamar al método GDI DeleteObject para liberar la memoria utilizada por el objeto de mapa de bits GDI. Para obtener más información acerca de los mapas de bits GDI, consulte Mapas de bits en la documentación de GDI de Windows.

Cuestiones relacionadas