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#中读取App.config配置文件代码实例

    下面就给您详细讲解一下在C#中读取App.config配置文件的完整攻略。 什么是App.config? 在C#项目中,App.config是存放配置信息的文件,经常用来保存应用程序的配置信息,比如数据库连接字符串、路径等等。在项目中对于一些数据的统一管理是非常有用的,修改方便,且使用配置文件时只需要修改App.config即可不用修改代码。 读取App.c…

    C# 2023年6月1日
    00
  • C#集合之集(set)的用法

    让我为您详细讲解一下“C#集合之集(set)的用法”。 什么是集(set)? 在C#中,集(set)是一种无序不重复元素的集合。集合是由哈希表实现的,所以集合中的元素是无序的。集合中的每个元素都是唯一的,这意味着同一个元素不会被添加到集合中两次。 集(set)的使用方法 创建集合并添加元素 使用HashSet<T>类可以创建一个集合,并向其中添加…

    C# 2023年6月3日
    00
  • C#字符串String及字符Char的相关方法

    下面就是关于 C# 字符串 String 及字符 Char 相关方法的详细攻略。 字符串 String 字符串简介 C# 中的字符串是一组字符的集合,用双引号引起来的字符序列,在 C# 中被认为是值类型。字符串可以包含任何字符,包括特殊字符、数字和字母。 C# 字符串是不可改变的,也就是说,一旦创建了一个字符串对象,就不可以改变它。 字符串的方法 C# 的 …

    C# 2023年5月15日
    00
  • c#静态方法和非静态方法详细介绍

    下面是关于”C#静态方法和非静态方法详细介绍”的完整攻略。 什么是静态方法和非静态方法 C#中的方法可以分为静态方法和非静态方法。 静态方法定义在类中,可以直接通过类名来调用。非静态方法定义在类中,必须通过对象来调用。 以下是一个简单的示例,演示了一个类中包含一个静态方法和一个非静态方法: public class MyClass { public stat…

    C# 2023年6月7日
    00
  • C#实现大数字运算的实例代码

    C#实现大数字运算的实例代码攻略 什么是大数字运算 大数字运算是指对于超过计算机所能直接表示的数字,可以通过算法实现运算。在C#中,数字类型有限,当数字过大时,计算结果可能会溢出或者得出错误的结果。为了解决这种问题,需要用大数字运算方式来处理。 C#中的大数字运算 C#中提供了BigInteger结构和BigDecimal类,可以用于大数字运算。在进行大数字…

    C# 2023年6月7日
    00
  • C#环形队列的实现方法详解

    C#环形队列的实现方法详解 什么是环形队列 环形队列(Circular Queue),也叫循环队列,是一种环形存储结构,相比线性队列具有更高的效率。 在环形队列中,队列的尾部指针在达到队列的最大容量时会重新指向队列的头部,实现循环利用队列空间的效果。 环形队列的实现方法 环形队列的结构 在C#中,我们可以使用数组来实现环形队列,其结构如下: public c…

    C# 2023年6月7日
    00
  • C#实现按照指定长度在数字前补0方法小结

    C#实现按照指定长度在数字前补0的方法可以使用string.PadLeft()方法来实现。该方法可以在指定字符串的左侧填充指定的字符,直到字符串的长度达到指定的长度。 下面是实现该方法的步骤: 将数字转换为字符串类型。 使用string.PadLeft()方法在字符串左侧填充指定的字符,直到字符串长度达到指定长度。 返回填充后的字符串。 下面是一个简单的示例…

    C# 2023年6月7日
    00
  • C#实现托盘程序并禁止多个应用实例运行的方法

    我来为您详细讲解“C#实现托盘程序并禁止多个应用实例运行的方法”的完整攻略: 实现托盘程序 实现托盘程序需要使用到.Net Framework提供的NotifyIcon控件,下面是一个简单的示例代码: private NotifyIcon notifyIcon; // 托盘图标 public Form1() { InitializeComponent(); …

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