我正在尝试快速制作屏幕截图。
所以,我在我的主类
中使用这段代码[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。
那么,我该怎么办?也许我应该复制,但我不知道如何。
答案 0 :(得分:1)
假设您的显示为1920x1080,即2,073,600像素,则PixelFormat.Format32bppArgb
每像素有4个字节,因此为8,294,400字节,即大约8 MB。 109张图片将是872 MB。感到惊讶的是那里的崩溃,但你明白了,这是太多的记忆。
如果你想制作动画gif,那么想想全屏会有多大?好吧,我希望你没有刨那个,这对gif来说不实用。截取屏幕截图后,立即将其调整为目标分辨率,以便减少内存。