65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.73/5 (7投票s)

2014 年 9 月 9 日

CPOL

2分钟阅读

viewsIcon

28937

downloadIcon

381

这是“控制台监视器”的替代方案

引言

本技巧解释了创建包含屏幕内容的图像的整个过程,例如屏幕上的窗口和其他细节。 此处未设置计时器,每次应用程序运行时,它都会将图像保存到您的文档文件夹中,您可以在其中访问它。

背景

今天,我看到了一位 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);

屏幕上的结果

Screenshot image

关注点

我了解到在整个 .NET Framework 中不存在图形构造函数。

历史

  • 第一篇帖子!
  • 第二篇帖子:删除了 Console.WriteLine() 的过度使用,并添加了代码以确保每次运行程序时都保存新的截图
© . All rights reserved.