作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我需要逐像素绘制图像并将其显示在 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/
我需要逐像素绘制图像并将其显示在 WPF 中。我试图通过使用 System.Drawing.Bitmap 然后使用 CreateBitmapSourceFromHBitmap() 为 WPF Imag
我是一名优秀的程序员,十分优秀!