我正在用C#开发一个应用程序,我还开发了一个库,它可以使用Aforge摄像头完成一些工作。其中一个要点是简单地捕捉网络凸轮前面的图像,并在特定的PictureBox上显示出来:
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中。
我的疑问是:
在一些计算机中,这种绘画方式会产生很高的内存泄漏。摄像头的配置是:640x480,如果它更高,内存泄漏就会增加。
计算机配置:
Intel i5:内存泄漏到500 to
Intel i7:没有内存泄漏。
双关(不太强大):没有那么多内存泄漏。
编辑:
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 2010的发布模式中,而不发生在调试上。
NOTE2: --我认为这是FromBimapImage带来的问题,因为我尝试了一个WindowsForms应用程序而不是WPF应用程序,而没有内存泄漏.
发布于 2013-04-09 19:30:41
AForge 拥有权图像的字节,您应该制作自己的深副本。将框架传递给Bitmap构造函数是不够的。如果框架不能正确地释放位图,因为您有它的引用,那么就会有漏洞。
试着用这个:
private void NewFrame(object sender, NewFrameEventArgs args)
{
Bitmap newFrame = AForge.Imaging.Image.Clone(args.Frame);
PictureBox.FromBitmapImage(newFrame);
newFrame.Dispose();
}发布于 2014-09-09 23:41:20
这对我有用。
if (pictureBox1.Image != null) {
pictureBox1.Image.Dispose();
}
Bitmap bitmap = eventArgs.Frame.Clone() as Bitmap;
pictureBox1.Image = bitmap;发布于 2017-07-25 07:16:08
在分配新的图片之前正确地处理图片框图像可以防止内存泄漏,但是当我调整图片框的大小时会抛出错误。问题可能是因为处理图像太快了。它对我起作用的是将旧图像保留在队列中,并以延迟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();
}
}https://stackoverflow.com/questions/15899970
复制相似问题