gpt4 book ai didi

c# - Image.RotateFlip 泄漏内存 :/

转载 作者:太空狗 更新时间:2023-10-29 21:46:52 26 4
gpt4 key购买 nike

虽然我已经编程了大约 11 年(主要是 VB6,最后 6 个月是 C#),但这是第一次真正提出问题 :) 我已经从 interwebz 找到了我所有的答案,但这个问题我无法解决我。您的网站是我从中获得最佳答案的最有帮助的地方之一!

我将展示我正在使用的代码(相关内容的摘录)。问题是,当使用 RotateFlip 方法时,内存迅速增加到 ~200M,然后在一段时间后被 GC 收集。调用它的主要方法每秒迭代约 30 次,因此性能在这里至关重要。我曾尝试使用图形矩阵变换,但这有时会失败并显示非翻转图像。该应用程序本身基于使用网络摄像头,隐藏预览,拍摄回调图片并将其显示在图片框中。然后它在另一个类的 if 上覆盖一个矩形。这就是使用回调而不是预览窗口的原因。

Capture.cs 类:

internal Bitmap LiveImage;

int ISampleGrabberCB.BufferCB(double bufferSize, IntPtr pBuffer, int bufferLen)
{
LiveImage = new Bitmap(_width, _height, _stride, PixelFormat.Format24bppRgb, pBuffer);

if (ExpImg) // local bool, used rarely when the picture saving is triggered
{
LiveImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
var a = LiveImage.Clone(new Rectangle(Currect.Left, Currect.Top, Currect.Width, Currect.Height),
LiveImage.PixelFormat);
using (a)
a.Save("ocr.bmp", ImageFormat.Bmp);

}
else // dmnit, rotateflip leaks like h*ll but matrix transform doesn't sometimes flip :S
{
LiveImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
/*using (var g = Graphics.FromImage(LiveImage))
{
g.Transform = _mtx;
g.DrawImage(LiveImage, 0, 0);
}*/
}
GC.Collect(); // gotta use it with rotateflip, otherwise it gets crazy big, like ~200M :O
return 0;
}
}

在主窗体中,我有一个更新图片框中图片的事件:

private void SetPic()
{
pctCamera.Image = _cam.LiveImage;
_cam.PicIsFree = false;
}

因为我需要将图像获取到另一个类中的主窗体,所以我认为最合乎逻辑的是暴露的位图,它在每个回调帧上更新。我不想使用矩阵变换的原因是因为它速度较慢,有时以这种速度无法翻转图像,并且这种行为的频率与具有不同硬件功能和 CPU 速度的不同 PC 有很大不同,也是最快的帧速率30fps 和 1.2GHz CPU 经常显示这一点。

那么,你能帮我弄清楚吗?我实际上并没有在当前版本中使用它,我使用的是注释掉的矩阵变换,因为我对使用 GC.Collect 感觉不好:(

谢谢!!!

最佳答案

pctCamera.Image = _cam.LiveImage;

如您观察到的大量内存使用是您错过了在某处调用 Dispose() 的机会的明确标志,让位图使用的非托管资源(主要是内存)提前释放,而不是让垃圾收集器执行此操作。引用的语句就是这样一种情况,您没有处理图片框引用的旧图像。修复:

if (pctCamera.Image != null) pctCamera.Image.Dispose();
pctCamera.Image = _cam.LiveImage;

关于c# - Image.RotateFlip 泄漏内存 :/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6609413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com