【发布时间】:2011-12-14 09:51:39
【问题描述】:
我使用WebCam_Capture.dll 将网络摄像头中的图像捕获到 WPF 中的图像控件。对于每个捕获的帧,我都有一个名为 webCam_imageCaptured 的事件。每次我从网络摄像头收到新图像时它都会调用。在这种情况下,我调用方法LoadBitmap 来获取hBitmap 并接收BitmapSource 以将此捕获的图片放到Image 控件中。
下面是这个方法的代码:
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr handle);
public BitmapSource bs;
public IntPtr ip;
public BitmapSource LoadBitmap(System.Drawing.Bitmap source)
{
ip = source.GetHbitmap();
bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip, IntPtr.Zero, System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
DeleteObject(ip);
return bs;
}
这里是事件的代码:
private void webcam_ImageCaptured(object source, WebcamEventArgs e)
{
//_frameImage is Image WPF control.
_frameImage.Source = LoadBitmap((System.Drawing.Bitmap)e.WebCamImage);
}
我这里有个漏洞! RAM 最多可加载 1 GB,有时甚至更多! DeleteObject(ip) 并非每次调用时都有效。当 RAM 为 1 GB 或更多时,它会释放或显示内存不足错误。如何解决?
【问题讨论】:
-
您是否在不再需要位图时将其丢弃?
-
我尝试在 DeleteObject 方法之后进行处理。像这样:source.Dispose();但它没有帮助。
-
你确定泄漏真的在这里吗?你是怎么确定的?您是否使用过任何类型的分析器?是否有可能引用这些过时的 BitmapSource 对象?为什么你在使用后不处理你的位图?那肯定是(临时)内存泄漏。使用 BitmapCacheOptions.OnLoad 创建 BitmapSource 并删除 Bitmap。
-
@ED S. 你能举个例子吗?
-
添加了回复。希望对您有所帮助。
标签: c# .net wpf memory-leaks