一尘不染

WPF CreateBitmapSourceFromHBitmap()内存泄漏

c#

我需要逐个像素绘制一个图像并将其显示在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内存?


阅读 447

收藏
2020-05-19

共1个答案

一尘不染

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

2020-05-19