在 C# 中保存打印屏幕
本文关键字:打印 屏幕 保存 | 更新日期: 2023-09-27 18:26:27
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);
始终写入同一文件。
新的图像文件,例如打印屏幕1.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 是 SaveJPGWithCompressionSet 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);
}
}