我需要逐个像素绘制一个图像并将其显示在WPF中。我试图通过使用要做到这一点System.Drawing.Bitmap,然后使用CreateBitmapSourceFromHBitmap()创建BitmapSource的WPF Image控件。我在某处发生内存泄漏,因为当CreateBitmapSourceFromBitmap()反复调用时,内存使用率会上升,并且直到应用程序结束时才会下降。如果我不打电话CreateBitmapSourceFromBitmap(),内存使用情况没有明显变化。
System.Drawing.Bitmap
CreateBitmapSourceFromHBitmap()
BitmapSource
CreateBitmapSourceFromBitmap()
for (int i = 0; i < 100; i++) { var bmp = new System.Drawing.Bitmap(1000, 1000); var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); source = null; bmp.Dispose(); bmp = null; }
我该怎么做才能释放BitmapSource内存?
Bitmap.GetHbitmap()州的MSDN:
Bitmap.GetHbitmap()
备注 您负责调用GDI DeleteObject方法以释放GDI位图对象使用的内存。
备注
您负责调用GDI DeleteObject方法以释放GDI位图对象使用的内存。
因此,使用以下代码:
// at class level [System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern bool DeleteObject(IntPtr hObject); // your code using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(1000, 1000)) { IntPtr hBitmap = bmp.GetHbitmap(); try { var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); } finally { DeleteObject(hBitmap); } }
我也用声明代替了你的Dispose()电话using。
Dispose()
using