2011-12-29 33 views
7

Używam aplikacji WPF, która używa BitmapSource, ale muszę wykonać pewną manipulację , ale muszę wykonać pewne manipulacje System.Drawing.Bitmaps.Niezarządzana wyciek pamięci

Wykorzystanie pamięci aplikacji zwiększa się podczas jej działania.

mam zawężony wyciek pamięci do tego kodu:

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; 
} 

Zakładam, że jest niekontrolowana pamięci nie są umieszczone prawidłowo, ale nie wydaje się w każdym razie robi to ręcznie znaleźć. Z góry dziękuję za pomoc!

Alex

+0

możliwe duplikat [przeciek pamięci WPF CreateBitmapSourceFromHBitmap] (http://stackoverflow.com/questions/1546091/wpf-createbitmapsourcefromhbitmap-memory-leak) – Pieniadz

Odpowiedz

9

Trzeba zadzwonić DeleteObject(...) na hBitmap. Zobacz: 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

miałem napisać dokładnie tę samą odpowiedź;) Oto deklaracja metody "DeleteObject": '[DllImport (" gdi32.dll ")] statyczna zewnętrzna bool DeleteObject (IntPtr hObject);' – ken2k

+0

@ ken2k: I właśnie miałem dodać dokładnie tę samą deklarację. Dzięki! – MusiGenesis

+0

Dziękuję bardzo, że rozwiązuje mój problem! – aforward

4

Trzeba zadzwonić DeleteObject(hBitmap) na 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

Czy zwalniasz uchwyt bitmapy?

Zgodnie z MSDN (http://msdn.microsoft.com/en-us/library/1dz311e4.aspx)

Jesteś odpowiedzialny za wywołanie metody GDI DeleteObject uwolnić pamięć używaną przez obiekt bitmapy GDI. Aby uzyskać więcej informacji o bitmapach GDI, zobacz Bitmapy w dokumentacji GDI systemu Windows.