如何防止位图变量在循环中初始化时占用太多内存?
本文关键字:太多 内存 初始化 位图 何防止 变量 循环 | 更新日期: 2023-09-27 18:15:47
我正在制作一个屏幕记录程序,所以它的工作原理是,它需要很多照片,然后存储它们,使其成为一个视频,但我遇到了一个问题,使程序运行时间超过8秒。它占用了太多的内存
while (DateTime.Now.Minute * 60000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond < startTime+20000) {
memoryImage = new Bitmap(ScreenBounds.Width, ScreenBounds.Height);
// Create graphics
Console.WriteLine("Creating Graphics...");
Console.WriteLine();
Graphics memoryGraphics = Graphics.FromImage(memoryImage);
// Copy data from screen
Console.WriteLine("Copying data from screen...");
Console.WriteLine();
try
{
memoryGraphics.CopyFromScreen(0, 0, 0, 0, ScreenBounds);
}
catch (Exception er)
{
Console.WriteLine("Error when copying data from screen error: " + er.Message + " : breaking script");
break;
}
// Save it!
Console.WriteLine("Saving the image...");
images.Add(memoryImage);
GC.Collect();
GC.WaitForFullGCComplete();
你可以看到我尝试强制垃圾回收;问题变量是memoryImage,或者至少看起来是这样,我不完全确定。我怎样才能让这个程序使用更少的内存,这样它才不会崩溃?
更新:我添加了memoryImage.Dispose();到第一部分的结束,它修复了内存问题,但现在我得到错误:
类型为"System"的未处理异常。
system_drawing .dll附加信息:参数不合法。
VideoWriter video = new VideoWriter(@"outputVideo.avi", (int)AvgFPSList.Average(), Screen.PrimaryScreen.Bounds.Size, true);
for (int x = 0; x < images.Count; x++)
{
Image<Emgu.CV.Structure.Bgr, Byte> img = new Image<Emgu.CV.Structure.Bgr, Byte>(images[x]); << error here
video.Write(img.Mat);
}
为将来的观众回答最初的问题,
Graphics类实现了IDisposable。要从内存中删除它,可以将它包装在using语句中,或者在完成使用它时手动调用Dispose。
使用例子:using (Graphics memoryGraphics = Graphics.FromImage(memoryImage))
{
// perform operations on memoryGraphics
}
Bitmap也实现了IDisposable,应该在某些时候适当地处理。
作者对问题的更新可能是另一个问题。