虽然我已经编程大约11年(主要是VB6,最近6个月使用C#),但这是我第一次真正提问:)我从互联网上找到了所有答案,但这个问题我自己无法解决。您的网站是我获得最佳答案的最有帮助的地方之一!
我将展示我正在使用的代码(与相关内容的摘录)。问题是,在使用RotateFlip方法时,内存迅速增加到约200M,然后在一段时间后被GC回收。调用它的主方法每秒迭代约30次,因此性能在这里至关重要。我尝试过使用图形矩阵变换,但有时会失败并显示非翻转图像。应用程序本身基于使用网络摄像头,隐藏预览,拍摄回调图片并在picturebox中显示它。然后它从另一个类中覆盖一个矩形。这就是使用回调而不是预览窗口的原因。
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;
}
}
在主窗体中,我有一个事件,它会更新PictureBox中的图片:
private void SetPic()
{
pctCamera.Image = _cam.LiveImage;
_cam.PicIsFree = false;
}
因为我需要将图像传输到另一个类中的主表单,所以我认为最合适的方法是在每个回调帧上更新的公开位图。 我不想使用矩阵变换的原因是它会减慢速度,并且有时在这种速度下无法翻转图像,而这种行为的频率因不同PC的硬件能力和CPU速度而异,即使在1.2GHz CPU的最快帧速率30fps下也经常出现此问题。
所以,你能帮我解决这个问题吗?实际上,我没有在当前版本中使用它,而是使用了被注释掉的矩阵变换,因为我觉得使用GC.Collect感觉不太好:(
谢谢!
LiveImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
代码 - 你可以将其移到if
块之外。 - VMAtm