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

回到顶部