WPF CreateBitmapSourceFromHBitmap()内存泄漏
我需要逐个像素绘制一个图像并将其显示在WPF中。我试图通过使用要做到这一点System.Drawing.Bitmap
,然后使用CreateBitmapSourceFromHBitmap()
创建BitmapSource
的WPF
Image控件。我在某处发生内存泄漏,因为当CreateBitmapSourceFromBitmap()
反复调用时,内存使用率会上升,并且直到应用程序结束时才会下降。如果我不打电话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:
您负责调用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
。
以上是 WPF CreateBitmapSourceFromHBitmap()内存泄漏 的全部内容, 来源链接: utcz.com/qa/408480.html