C#实现截图工具小项目

下面是详细的C#实现截图工具小项目攻略。

一、项目背景

截图工具是一款在电脑操作中十分常用的小工具,通过对电脑屏幕进行截图来方便用户进行操作、记录等。而使用C#进行开发,同样可以实现一个简单易用的截图工具,因此本篇攻略主要讲解如何使用C#实现截图工具。

二、开发准备

  1. 开发工具:Visual Studio或Visual Studio Code(推荐使用Visual Studio,因为Visual Studio内置了更多的开发辅助工具)
  2. 运行环境:.NET Framework(目前新版已经升级至.NET Core)

三、项目实现

1.准备工作

我们需要在窗体中添加一个PictureBox控件,用来显示截图内容。可以通过拖拽的方式将PictureBox控件添加进窗体。

2.截屏实现

我们可以使用C#中的Screen类来获取屏幕的信息,以及使用Graphics类来进行绘制。以下是C#实现截图的代码:

   public static Image CaptureScreen()
   {
       Rectangle screenSize = Screen.PrimaryScreen.Bounds;
       Bitmap result = new Bitmap(screenSize.Width, screenSize.Height);
       using (Graphics g = Graphics.FromImage(result))
       {
           g.CopyFromScreen(screenSize.Left, screenSize.Top, 0, 0, screenSize.Size);
       }
       return result;
   }

首先通过Screen.PrimaryScreen.Bounds获取屏幕信息,并新建一个大小与屏幕信息相同的Bitmap对象result。然后使用Graphics.FromImage(result)获取Bitmap对象所对应的Graphics对象,最后通过g.CopyFromScreen获取屏幕截图。

3.绘制选区

在截屏时,我们可能只需要其中的一部分内容。因此,我们需要先绘制一个选区框,来指定我们所需要的内容。下面的代码将绘制一个红色边框的方框:

    public static void DrawRectangle(Graphics g, int x1, int y1, int x2, int y2)
    {
        int xmin = Math.Min(x1, x2);
        int ymin = Math.Min(y1, y2);
        int width = Math.Abs(x1 - x2);
        int height = Math.Abs(y1 - y2);
        var pen = new Pen(Color.Red);
        g.DrawRectangle(pen, xmin, ymin, width, height);
    }

4.实现

通过鼠标的移动与点击事件来实现截图并显示选中区域的内容,以下是完整代码:

public partial class Form1 : Form
{
    private Point startPoint;
    private Rectangle rect;
    private bool isMouseDown = false;
    private Image screenShot;

    public Form1()
    {
        InitializeComponent();
        this.DoubleBuffered = true;
        this.FormBorderStyle = FormBorderStyle.None;  
        this.WindowState = FormWindowState.Maximized; 
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        startPoint = e.Location;
        isMouseDown = true;
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        isMouseDown = false;
        this.Hide();
        Thread.Sleep(200);
        using (var bmp = new Bitmap(rect.Width, rect.Height))
        using (var g = Graphics.FromImage(bmp))
        {
            g.DrawImage(screenShot, new Rectangle(0, 0, bmp.Width, bmp.Height), rect, GraphicsUnit.Pixel);
            g.Save();
            pictureBox1.Image = bmp;
        }
        this.Close();
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isMouseDown) 
        {
            var current = e.Location;
            rect = new Rectangle
            {
                X = Math.Min(startPoint.X, current.X),
                Y = Math.Min(startPoint.Y, current.Y),
                Width = Math.Abs(startPoint.X - current.X),
                Height = Math.Abs(startPoint.Y - current.Y)
            };
            using (var g = CreateGraphics())
            {
                g.DrawImage(screenShot, new Rectangle(0, 0, Size.Width, Size.Height), 0, 0, screenShot.Width, screenShot.Height, GraphicsUnit.Pixel);
                DrawRectangle(g, rect.Left, rect.Top, rect.Right, rect.Bottom);
            }
        }
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape) 
        {
            this.Close();
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        screenShot = CaptureScreen();
        this.BackgroundImage = screenShot;
        this.Size = screenShot.Size;
    }

    public static Image CaptureScreen()
    {
        Rectangle screenSize = Screen.PrimaryScreen.Bounds;
        Bitmap result = new Bitmap(screenSize.Width, screenSize.Height);
        using (Graphics g = Graphics.FromImage(result))
        {
            g.CopyFromScreen(screenSize.Left, screenSize.Top, 0, 0, screenSize.Size);
        }
        return result;
    }

    public static void DrawRectangle(Graphics g, int x1, int y1, int x2, int y2)
    {
        int xmin = Math.Min(x1, x2);
        int ymin = Math.Min(y1, y2);
        int width = Math.Abs(x1 - x2);
        int height = Math.Abs(y1 - y2);
        var pen = new Pen(Color.Red);
        g.DrawRectangle(pen, xmin, ymin, width, height);
    }
}

其中,CaptureScreen()方法是用于截取屏幕原始画面的,DrawRectangle()方法是用于绘制选区框的。

四、项目应用

以上代码实现了截屏、绘制选区框和选中区域显示,最后形成了一个完整的截图工具。

以下是一个使用截图工具进行截图并保存到本地的代码示例:

private void btnScreenShot_Click(object sender, EventArgs e)
{
    var form = new Form1();
    form.ShowDialog();
    if (form.pictureBox1.Image != null)
    {
        var saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.Filter = "jpg files (*.jpg)|*.jpg|png files (*.png)|*.png|bmp files (*.bmp)|*.bmp";
        saveFileDialog1.FilterIndex = 1;
        saveFileDialog1.RestoreDirectory = true;
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            var file = saveFileDialog1.FileName;
            form.pictureBox1.Image.Save(file, System.Drawing.Imaging.ImageFormat.Jpeg); // 其他文件格式需要修改此处
            MessageBox.Show("截图已成功保存到:" + file);
        }
    }
}

该代码通过点击Button按钮调用新建的窗体Form1,截取到选取的屏幕区域,并将截图保存到本地。保存的文件格式可以通过代码中的System.Drawing.Imaging.ImageFormat.Jpeg进行修改。

总结

C#实现截图工具相对简单,代码实现也比较容易理解。在开发过程中我们主要是通过一些C#内置的类以及对窗体的操作进行实现,最终形成一个有用的工具。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现截图工具小项目 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C# winform跨线程操作控件的实现

    下面是详细的“C# winform跨线程操作控件的实现”的攻略: 1. 前言 在多线程编程过程中,经常会遇到需求需要在子线程中控制 UI 界面,这时就需要用到跨线程操作控件。在使用 C# 的 WinForm 编程时,我们可以使用 Invoke() 或 BeginInvoke() 方法来实现跨线程操作控件。 2. Invoke() 和 BeginInvoke(…

    C# 2023年5月15日
    00
  • c#利用webmail邮件系统发送邮件示例分享

    下面就为您详细讲解“c#利用webmail邮件系统发送邮件示例分享”的完整攻略。 准备工作 在使用C#代码发送邮件之前,需要先保证您的环境能够连接到网络,并且需要准备好以下信息: 发件人的邮箱和密码 收件人的邮箱 邮件服务器的地址和端口号 发送邮件步骤 发送邮件的步骤可以分为以下几部分: 创建MailMessage对象,并设置发送者、接收者、邮件主题和邮件内…

    C# 2023年6月7日
    00
  • unity 如何使用LineRenderer 动态划线

    下面就来详细讲解“Unity 如何使用 LineRenderer 动态划线”: 1. 什么是 LineRenderer? 在 Unity 中,LineRenderer 是一个可以用来渲染简单的线段的组件,通常用于实现绘制不同的几何图形,例如:射线、路径、沿着路径的粒子效果等等。 2. 如何使用 LineRenderer? 在 Unity 中使用 LineRe…

    C# 2023年6月3日
    00
  • C#使用NPOI对Excel数据进行导入导出

    下面就给大家详细讲解一下“C#使用NPOI对Excel数据进行导入导出”的完整攻略。 一、NPOI是什么? NPOI是一个跨平台的第三方.xls和.xlsx格式操作组件库,适用于.NET平台,可以方便地读取、创建和编辑Excel文件,提供了针对Excel文件的内存读写支持,支持xls、xlsx、doc、docx、ppt、pptx等多种Office格式。 二、…

    C# 2023年6月1日
    00
  • 原生JS实现加载进度条

    原生JS实现加载进度条 在Web开发中,加载进度条是一个非常常见的功能。本文将介绍如何使用原生JS实现加载进度条。 步骤1:HTML结构 首先,我们需要在HTML中添加进度条的结构。可以在HTML文件中添加以下代码: <div id="progress-bar"> <div id="progress"…

    C# 2023年5月15日
    00
  • C# 使用SHA1算法对密码进行加密

    要使用C#对密码进行加密,可以使用SHA1算法来实现,以下是详细攻略: 什么是SHA1算法 SHA1(Secure Hash Algorithm 1)是一种常用的加密算法,可以将任意长度的信息压缩成一个固定长度的输出,通常为20个字节(160位)。SHA1算法具有不可逆性、确定性、抗碰撞性等特点,经常被用于数字签名和数据加密等场景。 SHA1加密过程 SHA…

    C# 2023年6月8日
    00
  • ASP.NET CORE读取json格式配置文件

    ASP.NET Core 读取 JSON 格式配置文件的流程: 在 appsettings.json 文件中定义所需的配置项。 在 Program.cs 文件中使用 CreateDefaultBuilder(args) 方法创建 IHostBuilder 对象,并在 ConfigureAppConfiguration(…) 方法中添加读取配置文件的功能。…

    C# 2023年6月3日
    00
  • c# 以二进制读取文本文件

    当需要以二进制形式读取文本文件时,需要借助 C# 中的BinaryReader类。BinaryReader 类提供了许多读取不同数据类型的方法,并且可以对不同的编码方式进行解码。下面是读取文本文件的完整攻略: 步骤 1:创建BinaryReader对象 首先需要在代码中创建BinaryReader对象。可以使用FileStream类打开文本文件,并将其作为参…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部