我使用的是使用BitmapSource的WPF应用程序,但我需要进行一些操作 但我需要对System.Drawing.Bitmaps进行一些操作。
应用程序的内存使用会在运行时增加。
我已将内存泄漏范围缩小到此代码:
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;
}
我认为这是非托管内存没有正确处理,但我似乎无法手动找到它。在此先感谢您的帮助!
亚历
答案 0 :(得分:9)
您需要在DeleteObject(...)
上致电hBitmap
。请参阅: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;
}
答案 1 :(得分:4)
您需要在hBitmap上调用DeleteObject(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;
}
答案 2 :(得分:1)
MSDN说You are responsible for calling the GDI DeleteObject method to free the memory used by the GDI bitmap object.。以下问题涉及同一问题,已经回答WPF CreateBitmapSourceFromHBitmap memory leak
答案 3 :(得分:0)
您是否正在发布位图句柄?
根据MSDN(http://msdn.microsoft.com/en-us/library/1dz311e4.aspx)
您负责调用GDI DeleteObject方法来释放GDI位图对象使用的内存。有关GDI位图的更多信息,请参阅Windows GDI文档中的位图。