我從網絡攝像頭捕獲圖像到圖像控件在WPF與WebCam_Capture.dll
。對於每個捕獲的幀我有事件稱爲webCam_imageCaptured
。每次當我從網絡攝像機收到新圖像時都會調用它。在這個事件中,我調用方法LoadBitmap
來獲取hBitmap並接收BitmapSource將捕獲的圖片放到Image控件中。 下面是這個方法的代碼:位圖和hBitmap內存泄漏
[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並擺脫位圖。 –