使用 C# 保存截图,又名“控制台监视器”






3.73/5 (7投票s)
这是“控制台监视器”的替代方案
引言
本技巧解释了创建包含屏幕内容的图像的整个过程,例如屏幕上的窗口和其他细节。 此处未设置计时器,每次应用程序运行时,它都会将图像保存到您的文档文件夹中,您可以在其中访问它。
背景
今天,我看到了一位 CodeProject 用户的文章,他尽力教我们如何从屏幕上保存截图。 但它包含一些错误,而且效率不高,因为文章的主要部分缺失,并且他没有向用户展示代码。
所需的程序集
与其他项目一样,此项目需要一些程序集。 要将它们包含在您的项目中,您可以引用命名空间,可以使用 Visual Studio 的“添加引用”对话框来执行此操作(我不确定其他 IDE 是否支持)。
此项目需要调用的命名空间如下
using System.Drawing;
using System.IO;
using System.Windows.Forms;
System.Drawing
此命名空间需要用于图形、位图等。 没有它,它们将无法工作,并且 IntelliSense 会显示未找到此命名空间错误。
System.IO
此命名空间需要用于保存(图像)文件。 顾名思义,它是用于输入/输出命令的命名空间。 使用它在文件系统中保存、删除文件!
其余代码只是一个简单的控制台应用程序,用于检查屏幕上的详细信息并将它们转换为图形以保存到 PNG 文件中。
Using the Code
项目的代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.IO;
namespace Test_Application_C_Sharp
{
class Program
{
// a method to pause the console.
// not a part of this project!
public static void pause()
{
Console.Read();
}
static void Main(string[] args)
{
// Start the process...
Console.WriteLine("Starting the process...");
Console.WriteLine();
Bitmap memoryImage;
memoryImage = new Bitmap(1000, 900);
Size s = new Size(memoryImage.Width, memoryImage.Height);
Graphics memoryGraphics = Graphics.FromImage(memoryImage);
memoryGraphics.CopyFromScreen(0, 0, 0, 0, s);
//That's it! Save the image in the directory and this will work like charm.
string fileName = string.Format(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +
@"\Screenshot" + "_" +
DateTime.Now.ToString("(dd_MMMM_hh_mm_ss_tt)") + ".png");
// save it
memoryImage.Save(fileName);
// Write the message,
Console.WriteLine("Picture has been saved...");
// Pause the program to show the message.
Program.pause();
}
}
}
您会发现代码在某些地方非常有趣。
您从图像创建图形,实际上是 1000x900 大小的位图。 完成后,您从屏幕获取像素并将它们粘贴到图形画布上,如下所示
// Create graphics from the Image (Bitmap)
Graphics memoryGraphics = Graphics.FromImage(memoryImage);
// Copy data from screen
memoryGraphics.CopyFromScreen(0, 0, 0, 0, s);
注意:s 是位图本身的大小,请参阅代码。
我正在使用位图图像的大小来创建图形,然后将内容数量保存到图形画布上。
Bitmap memoryImage;
memoryImage = new Bitmap(1000, 900);
Size s = new Size(memoryImage.Width, memoryImage.Height);
类似地,文件夹和图像名称现在是动态的,并且始终指向您的文档文件夹,使用 .NET Framework 中的特殊文件夹。
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Screenshot.png"
..将为您提供文件夹,最后的 string
是图像的名称。 也就是“screenshot.png”。
完成所有这些操作后,只需调用 Save 方法即可保存位图。
memoryImage.Save(str);
屏幕上的结果
关注点
我了解到在整个 .NET Framework 中不存在图形构造函数。
历史
- 第一篇帖子!
- 第二篇帖子:删除了
Console.WriteLine()
的过度使用,并添加了代码以确保每次运行程序时都保存新的截图