私のWebカメラからの画像を、WebCam_Capture.dll
でWPFの画像コントロールにキャプチャします。キャプチャされたすべてのフレームについて、私はwebCam_imageCaptured
というイベントを持っています。私はウェブカメラから新しい画像を受け取るたびに呼び出します。このイベントでは、メソッドLoadBitmap
を呼び出してhBitmapを取得し、BitmapSourceを受け取って、このキャプチャした画像を画像コントロールに配置します。ここ は、このメソッドのコードです:ビットマップと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を作成し、Bitmapを削除します。 –