gpt4 book ai didi

c# - WPF CreateBitmapSourceFromHBitmap() 内存泄漏

转载 作者:IT王子 更新时间:2023-10-29 03:53:02 27 4
gpt4 key购买 nike

我需要逐像素绘制图像并将其显示在 WPF 中。我试图通过使用 System.Drawing.Bitmap 然后使用 CreateBitmapSourceFromHBitmap() 为 WPF Image 控件创建 BitmapSource 来执行此操作。我在某处发生内存泄漏,因为当重复调用 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 内存?

最佳答案

MSDN for Bitmap.GetHbitmap()状态:

Remarks

You are responsible for calling the GDI DeleteObject method to free the memory used by the GDI bitmap object.

所以使用下面的代码:

// 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);
}
}

我还用 using 语句替换了您的 Dispose() 调用。

关于c# - WPF CreateBitmapSourceFromHBitmap() 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1546091/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com