2011-12-29 30 views
7

Tôi đang sử dụng ứng dụng WPF sử dụng BitmapSource nhưng tôi cần thực hiện một số thao tác nhưng tôi cần thực hiện một số thao tác của System.Drawing.Bitmaps.Rò rỉ bộ nhớ không được quản lý

Việc sử dụng bộ nhớ của ứng dụng tăng trong khi nó chạy.

tôi đã thu hẹp xuống rò rỉ bộ nhớ để mã này:

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

tôi giả sử nó là bộ nhớ không được quản lý không được xử lý đúng cách, nhưng tôi dường như không thể tìm thấy anyway để làm việc đó bằng tay. Cảm ơn trước sự giúp đỡ nào!

Alex

+0

thể trùng lặp của [WPF CreateBitmapSourceFromHBitmap bộ nhớ bị rò rỉ] (http://stackoverflow.com/questions/1546091/wpf-createbitmapsourcefromhbitmap-memory-leak) – Pieniadz

Trả lời

9

Bạn cần phải gọi DeleteObject(...) trên hBitmap của bạn. Xem: 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

tôi sắp viết chính xác câu trả lời tương tự;) Đây là khai báo phương thức 'DeleteObject': ' [DllImport ("gdi32.dll")] static extern bool DeleteObject (IntPtr hObject); ' – ken2k

+0

@ ken2k: và tôi sắp thêm chính xác tuyên bố đó. Cảm ơn! – MusiGenesis

+0

Cảm ơn rất nhiều, giải quyết được vấn đề của tôi! – aforward

4

Bạn cần phải gọi DeleteObject(hBitmap) trên 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

Bạn có đang phát hành xử lý bitmap không?

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

Bạn chịu trách nhiệm cho cách gọi phương thức GDI DeleteObject để giải phóng bộ nhớ được sử dụng bởi các đối tượng bitmap GDI. Để biết thêm thông tin về bitmap GDI, hãy xem Bitmap trong tài liệu Windows GDI.