【问题标题】:Save print screen in C#在 C# 中保存打印屏幕
【发布时间】:2013-08-04 18:21:47
【问题描述】:
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。

【问题讨论】:

  • 如果你不告诉它,它肯定不会。 :)

标签: c#


【解决方案1】:

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

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

【讨论】:

  • +1(又名我平安而来)使用当前日期而不是 GUID 怎么样?似乎更合适。
【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      在每个 button click 上创建一个字段,例如 counterincrement,并将其用作文件名 -

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

      【讨论】:

        【解决方案5】:

        你也可以这样试试:

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

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

        【讨论】:

          【解决方案6】:
                             {
                              //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);
                      }
          

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-07
            • 2014-03-20
            • 2020-09-16
            • 1970-01-01
            • 1970-01-01
            • 2017-02-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多