2013-04-09 2 views
2

저는 C#에서 응용 프로그램을 개발 중이며 Aforge 카메라로 몇 가지 작업을 수행하는 라이브러리를 개발했습니다.AForge 카메라 메모리 누수

camera.NewFrame += NewFrame; 

private void NewFrame(object sender, NewFrameEventArgs args) 
    { 
     Bitmap newFrame = new Bitmap(args.Frame); 
     args.Frame.Dispose(); 
     PictureBox.FromBitmapImage(newFrame); 
     newFrame.Dispose(); 
     newFrame = null; 
    } 

내가 여기서 무엇을, 나는 모든 프레임을 얻고로 페인트 : 포인트 중 하나는 단순히 웹 캠 앞에 무엇의 이미지를 캡처하고 이렇게 특정 PictureBox에 그것을 보여주는 것입니다 PictureBox.

내 의심의 여지가 있습니다 : 일부 컴퓨터에서

는 회화의이 방법은 정말 높은 메모리 누수를 생성합니다. 카메라 구성은 640x480이고 높으면 메모리 누수가 증가합니다.

컴퓨터 구성 : NO 메모리 누수 :

인텔 I5 :이 500MB

인텔 I7에 메모리 누수.

Double coeur (강력하지는 않음) :별로 메모리 누출이 없습니다.

편집 : 일부 컴퓨터 등하지의 메모리 누수가 왜

public static void FromBitmapImage(this Image image, Bitmap bitmap) 
    { 
     BitmapImage bitmapImage = new BitmapImage(); 

     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      bitmap.Save(memoryStream, ImageFormat.Bmp); 
      memoryStream.Position = 0; 
      bitmapImage.BeginInit(); 
      bitmapImage.StreamSource = memoryStream; 
      bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
      bitmapImage.EndInit(); 
     } 

     image.Source = bitmapImage; 
     bitmapImage = null; 
    } 

나는 ... 이해하지 못하는 어떤 제안하십시오?

참고 : 메모리 누수는 Visual Studio 2010 릴리스 모드에서만 발생하지만 디버그에서는 발생하지 않습니다.

NOTE2 : 내가

+0

'PictureBox.FromBitmapImage (Bitmap) '란 무엇이며 어떻게 되나요? –

답변

3

AForge owns 이미지의 바이트 ... 내가 대신 WPF 하나없이 메모리 누수의 WindowsForms 응용 프로그램을 시도하기 때문에 문제의 FromBimapImage되어 생각, 당신이해야 자신의 깊은 사본. 비트 맵 생성자에 프레임을 전달하는 것만으로는 충분하지 않습니다. 프레임 워크가 참조를 가지고 있기 때문에 프레임 워크가 비트 맵을 제대로 처리 할 수없는 경우 누수가 발생합니다.

이 함께 시도 :

private void NewFrame(object sender, NewFrameEventArgs args) 
{ 
    Bitmap newFrame = AForge.Imaging.Image.Clone(args.Frame); 
    PictureBox.FromBitmapImage(newFrame); 
    newFrame.Dispose(); 
} 
+0

이 방법을 사용했지만 여전히 메모리 누수가 있습니다. 그 메모리 누출은 Visual Studio 2010에서 릴리스 될 때만 존재한다는 것을 알았습니다.왜 어떤 생각? – Sonhja

+0

당신의 솔루션은 문제의 일부 였지만, 나는 또한 memorystream 메서드에서'BitmapImage'를'Freeze'해야했습니다 :) Solved! – Sonhja

2

이 나를 위해 작동합니다.

 if (pictureBox1.Image != null) { 
      pictureBox1.Image.Dispose(); 
     } 
     Bitmap bitmap = eventArgs.Frame.Clone() as Bitmap; 
     pictureBox1.Image = bitmap; 
0

새로 할당하는 메모리 누수를 방지하기 위해 노력하지만, 내가 그림 상자 크기를 조정할 때 오류를 던졌다 직전에 그림 상자 이미지를 폐기. 아마 문제는 이미지를 너무 빨리 폐기해야하기 때문입니다. 그것이 나를 위해 일한 것은 대기열에 오래된 이미지를 유지하고 5 이미지의 지연으로 그들을 처분했다. 이것은 그림 상자가 따라 잡을 충분한 시간을 줄 것입니다.

private Queue<Image> _oldImages = new Queue<Image>(); 
... 

if (pictureBox1.Image != null) 
{ 
    _oldImages.Enqueue(pictureBox1.Image); 
    if (_oldImages.Count > 5) 
    { 
    var oldest = _oldImages.Dequeue(); 
    oldest.Dispose(); 
    } 
}