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日

相关文章

  • Entity Framework Core 大小写敏感处理

      可以使用’StringComparison’吗? 在数据库查询操作中,不可避免去考虑字母大小写的问题,比如要在Movie表中查找“X-Men”这部电影,为了不区分字母大小写,按照Linq to memory的习惯,可能会写出如下代码: DbContext.DbSet<Movie>  .Where(item => string.Equal…

    C# 2023年4月17日
    00
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈 简介 注释是一种解释源代码的方法,在C#中,注释可以分为两种类型:单行注释和多行注释。 单行注释 在代码行的后面以双斜杠 // 开头,这一行的内容就被视作注释,注释可以在同一行代码的下方,说明这一行代码的作用。 示例: int a = 1; // 定义变量a,赋值为1 多行注释 多行注释又称块注释,可以用用 /* 和 */ 包围一…

    C# 2023年5月15日
    00
  • Jenkins安装的时区问题分析解决

    Jenkins安装的时区问题分析解决 Jenkins 是一种流行的持续集成和持续交付工具,它可以帮助开发人员自动化构建、测试和部署应用程序。在安装 Jenkins 时,可能会遇到时区问题,导致 Jenkins 显示的时间不正确。本攻略将介绍如何分析和解决 Jenkins 安装的时区问题。 问题分析 Jenkins 显示的时间不正确可能是由于以下原因导致的: …

    C# 2023年5月17日
    00
  • 解析C#中@符号的几种使用方法详解

    解析C#中@符号的几种使用方法详解 什么是@符号 在C#的语法中,@符号表示对一个字符串进行特殊处理。具体地讲,它可以将一个字符串中的转义字符忽略掉,也可以使一个字符串中的关键字变成非关键字。 @符号的使用方法 1. 忽略字符串中的转义字符 我们知道,在普通的字符串中,转义字符需要使用反斜杠进行转义,比如: string str1 = "这是一个带…

    C# 2023年6月8日
    00
  • C#实现目录跳转(TreeView和SplitContainer)的示例代码

    下面是详细讲解“C#实现目录跳转(TreeView和SplitContainer)的示例代码”的完整攻略。 1.示例说明 在实现目录跳转的过程中,我们需要使用到TreeView控件和SplitContainer控件。其中TreeView控件用于显示文件夹和文件结构,SplitContainer控件用于分割窗体,将TreeView控件和文件内容的显示区域分开,…

    C# 2023年6月6日
    00
  • C# Path.GetTempFileName – 获取一个临时文件名

    Path.GetTempFileName() 是 C# 中的一个方法,用于生成一个唯一的临时文件名,以便在应用程序中保存临时数据。 该方法的返回值是一个字符串,包含一个全局唯一的文件名。临时文件名是基于系统的临时目录和指定的前缀生成的。 以下是使用 Path.GetTempFileName() 方法的完整攻略: 1. 获取临时文件名 string tmpFi…

    C# 2023年4月19日
    00
  • C#中值类型和引用类型的区别深度分析

    C#中值类型和引用类型的区别深度分析 什么是值类型和引用类型? 在C#中,数据类型分为值类型和引用类型两种。 值类型具有以下特点: 存储在栈上; 直接保存值本身; 复制操作是值的拷贝。 而引用类型则具有以下特点: 存储在堆上; 存储的是指向数据的内存地址,即引用; 复制操作只是复制了引用,不是复制数据本身。 如果一个变量存储的是值类型数据,则该变量直接保存具…

    C# 2023年5月15日
    00
  • C#中comboBox实现三级联动

    下面我来详细讲解C#中如何使用comboBox实现三级联动。 实现思路 三级联动是指在页面中有三级选项,当第一级选项发生变化时,第二级选项和第三级选项的内容会随之改变。在C#中,我们可以利用comboBox控件的SelectedIndexChanged事件和Add方法来实现三级联动。 首先,在设计表单时,我们需要创建三个comboBox控件,分别用来显示三级…

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