在C#中保存打印屏幕

8
Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
                                    Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(bitmap as Image);
graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size);
bitmap.Save(@"C:\Temp\printscreen.jpg", ImageFormat.Jpeg);

这是我的截屏按钮代码。问题在于我按了几次按钮后,它只会覆盖旧的图片文件(printscreen.jpg),而不会创建另一个新的图片文件,例如printscreen1.jpg。


7
如果你不告诉它的话,它肯定不会这样做。 :) - Chris
6个回答

9

试一下这个。每次都会生成一个唯一的文件。

Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
                                    Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(bitmap as Image);
graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size);
bitmap.Save(@"C:\Temp\printscreen"+Guid.NewGuid()+".jpg", ImageFormat.Jpeg);

或者

Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
                                    Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(bitmap as Image);
graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size);
var date = DateTime.Now.ToString("MMddyyHmmss");
bitmap.Save(@"C:\Temp\printscreen"+date+".jpg", ImageFormat.Jpeg);

6
+1(又称我来自和平)如何使用当前日期而不是全局唯一标识符?看起来更合适。 - User 12345678

6

它不会创建另一个新的图像文件

您没有要求它创建一个,您的代码

bitmap.Save(@"C:\Temp\printscreen.jpg", ImageFormat.Jpeg);

始终写入同一文件。

例如printscreen1.jpg这样的新图像文件。

如果您想创建新文件,需要动态生成文件名。类似于:

 string fileName = System.IO.Path.GetTempPath() + DateTime.Now.ToString() + ".jpg";
 bitmap.Save(fileName, ImageFormat.Jpeg);

3
您可以统计以 printscreen 开头的目录中已有多少个文件。
int count =  Directory.EnumerateFiles(@"C:\Temp\").Where(x => x.StartsWith("printscreen")).Count();
bitmap.Save(String.Format(@"C:\Temp\printscreen{0}.jpg", count), ImageFormat.Jpeg);

如果您有很多文件,这种方法可能会更慢,因为它必须遍历所有文件,但它更加自动化。

另一个选择是创建一个存储当前计数器编号的文件。

File.Write("Counter.txt", counter.ToString());

当您想在程序重新启动后开始计数时,可以执行以下操作。

int counter = 0;
if(File.Exists("Counter.txt"))
   counter = Int32.Parse(File.ReadAllText("Counter.txt"));

bitmap.Save(String.Format(@"C:\Temp\printscreen{0}.jpg", ++counter), ImageFormat.Jpeg);

当然,如果您不打算重新启动应用程序并继续序列,则可以避免将计数器存储在文本文件中,只需从零开始递增计数器。


1
                   {
                    //Application.DoEvents();
                    Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
                    Graphics graphics = Graphics.FromImage(printscreen as Image);
                    graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
                    string path = "";
                    if (forLog)
                    {
                        path = LoggerPath + StudentNumber.ToString() + "\\" + SessionID.ToString() + "\\";
                    }
                    else
                    {
                        path = PrintScreenPath + StudentNumber.ToString() + "\\" + SessionID.ToString() + "\\";
                    }
                    if (!Directory.Exists(path))
                        Directory.CreateDirectory(path);
                    string fileName = DateTime.Now.Ticks.ToString();
                    SaveJPGWithCompressionSetting(printscreen, path + fileName + ".jpeg", 17L);
                    printscreen.Dispose();
                    graphics.Dispose();
                    return fileName;
                }

这里是SaveJPGWithCompressionSetting方法

   private void SaveJPGWithCompressionSetting(Image image, string szFileName, long lCompression)
    {
            try
            {
                EncoderParameters eps = new EncoderParameters(1);
                eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, lCompression);
                ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
                image.Save(szFileName, ici, eps);
            }

}


1
创建一个名为counter的字段,并在每次按钮点击时对其进行递增,并将其用作文件名 -
bitmap.Save(@"C:\Temp\printscreen" + (counter++) + ".jpg", ImageFormat.Jpeg);

1

你也可以尝试像这样:

int number;
string[] path = Directory.GetFiles(@"C:\Temp\", @"PrintScreen*");

if (path.Length == 0)
{    bitmap.Save(@"C:\Temp\printscreen.jpg", ImageFormat.Jpeg); return;  }

Array.Sort(path);
Array.Reverse(path);

int.TryParse(Regex.Match(path[0], @"(\d+)(?=\.jpg)").ToString(), out number);
bitmap.Save(@"C:\Temp\printscreen" + (number + 1).ToString() + ".jpg", ImageFormat.Jpeg);

我认为通过按降序对文件进行排序来选择最后一个文件会更有效率,而不是枚举它们。此外,无需跟踪单独的计数器来选择最后一个计数并递增它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接