如何防止位图变量在循环中初始化时占用太多内存?

本文关键字:太多 内存 初始化 位图 何防止 变量 循环 | 更新日期: 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,应该在某些时候适当地处理。

作者对问题的更新可能是另一个问题。