截图非常快且内存不足

时间:2014-09-02 18:36:30

标签: c# .net visual-studio loops bitmap

我正在尝试快速制作屏幕截图。

所以,我在我的主类

中使用这段代码
[STAThread]
static void Main(string[] args)
{
    int x = 1;
    int screenshotsAmount = 0;
    List<Bitmap> screenshots = new List<Bitmap>();
    while (x == 1)
    {
        screenshots.Add(FullsizeScreenshot.makeScreenshot());
        Clipboard.SetImage(screenshots[screenshotsAmount]);
        Console.WriteLine("Screenshot " + screenshotsAmount + " has been made and added to the Bitmap list!");
        screenshotsAmount++;
    }
}

我的.dll中有一个创建屏幕截图的方法

// Class for making standard screenshots
public struct FullsizeScreenshot
{

    // Making fullscreen screenshot
    public static Bitmap makeScreenshot() 
    {
        Bitmap screenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);

            Graphics gfxScreenshot = Graphics.FromImage(screenshot);

            gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);

            gfxScreenshot.Dispose();

            return screenshot;
    }
}

一切正常,但是当屏幕截图的数量大于109时,我的程序会因System.ArgumentException而崩溃

未处理的类型&#34; System.ArgumentException&#34;在System.Drawing.dll中 附加信息:参数无效。

这一行抛出它: gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,Screen.PrimaryScreen.Bounds.Y,0,0,Screen.PrimaryScreen.Bounds.Size,CopyPixelOperation.SourceCopy); 或这个: Bitmap screenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height,PixelFormat.Format32bppArgb);

我尝试使用(Bitmap screenshot ....)和.Dispose(),但它没有正常工作,因为这些类(Bitmap和Graphics)是类,它们只是创建链接而不是制作副本。因此,当我在makeScreenshot()中处理Bitmap时,它打破了我的List中的Bitmap。

那么,我该怎么办?也许我应该复制,但我不知道如何。

1 个答案:

答案 0 :(得分:1)

假设您的显示为1920x1080,即2,073,600像素,则PixelFormat.Format32bppArgb每像素有4个字节,因此为8,294,400字节,即大约8 MB。 109张图片将是872 MB。感到惊讶的是那里的崩溃,但你明白了,这是太多的记忆。

如果你想制作动画gif,那么想想全屏会有多大?好吧,我希望你没有刨那个,这对gif来说不实用。截取屏幕截图后,立即将其调整为目标分辨率,以便减少内存。