在C#中保存打印屏幕

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。

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

 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); 

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

你不是要求它创建一个代码

 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); 

您可以计算以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); 

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

创建一个字段说counter并在每次button click increment它并将其用于文件名 –

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

你也可以尝试这样:

 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); 

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

  { //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; } 

并且ere是SaveJPGWithCompressionSetting metHod

  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); } 

}