使用C#实现对任意区域任意大小的截图

 更新时间:2024年01月30日 15:30:32   作者:lingxiao16888  
这篇文章主要为大家详细介绍了如何使用C#实现简单的截图功能,可以对任意区域任意大小的截图,感兴趣的小伙伴可以跟随小编一起学习一下

1.目的

实现类似系统截图工具那样对屏幕任何区域自定义大小的截图。

2.效果展示

点击截图

选择需要截图的区域:

区域选择完成后,单击右键完成截图:

在合适的载体上粘贴截图:

3.代码

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
            //获取屏幕截屏
            Bitmap bcgImg = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
            using (Graphics g= Graphics.FromImage(bcgImg))
            {
                g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(bcgImg.Width, bcgImg.Height));
 
            }
            //将图片传给截图窗口
            CaptureFrm frm = new CaptureFrm(bcgImg);
            frm.TopMost = true;
           if( frm.ShowDialog()== DialogResult.OK)
            {
                MessageBox.Show("截图已保存至剪贴板,请选择合适的载体进行粘贴!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("取消截图","提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            this.WindowState = FormWindowState.Normal;
        }
    }
public partial class CaptureFrm : Form
    {
        Bitmap bcgImg;
        bool drawingFlag=false;
        Point startPoint;
        Point endPoint;
        Graphics main_g;
        bool isCapture=false;
        public CaptureFrm(Bitmap img)
        {
            InitializeComponent();
            bcgImg = img;
        }
 
        private void CaptureFrm_Load(object sender, EventArgs e)
        {
            //背景
            this.BackgroundImage = bcgImg;
            this.BackgroundImageLayout = ImageLayout.Stretch;
 
        }
 
        private void CaptureFrm_KeyDown(object sender, KeyEventArgs e)
        {
            //如果按下ESC键则退出
            if (e.KeyCode == Keys.Escape)
            {
                //  this.Close();
                DialogResult = DialogResult.Cancel;
            }
        }
 
        private void CaptureFrm_MouseDown(object sender, MouseEventArgs e)
        {
          if(e.Button== MouseButtons.Left)
            {
                drawingFlag = true;
                startPoint = e.Location;
                main_g = this.CreateGraphics();
            }
          if(e.Button== MouseButtons.Right)
            {
                if (isCapture)
                {
                    Bitmap map = new Bitmap(width, height);
                    Bitmap source = new Bitmap(bcgImg, new Size(this.Width, this.Height));
                    using (Graphics g = Graphics.FromImage(map))
                    {
                        g.DrawImage(source, new Rectangle(0, 0, map.Width, map.Height), new Rectangle(recX, recY, width, height), GraphicsUnit.Pixel);
                    }
                    Clipboard.SetImage(map);
                    main_g.Dispose();
                    DialogResult = DialogResult.OK;
                    isCapture = false;
                }
            }
            
            
        }
 
        private void CaptureFrm_MouseUp(object sender, MouseEventArgs e)
        {
            if(e.Button== MouseButtons.Left)
            {
                //进行最终边界确认
                endPoint = e.Location;
                drawingFlag = false;
                isCapture = true;
            }
           
        }
        int recX, recY, width, height;
        private void CaptureFrm_MouseMove(object sender, MouseEventArgs e)
        {
            if (!drawingFlag ||main_g==null) return;
            
            width = Math.Abs(startPoint.X - e.X);
            height = Math.Abs(startPoint.Y - e.Y);
            if (startPoint.X < e.X)
            {
                recX = startPoint.X;
            }
            else
            {
                recX = startPoint.X-width;
            }
            if (startPoint.Y < e.Y)
            {
                recY = startPoint.Y;
            }
            else
            {
                recY = startPoint.Y-height;
            }
            CaptureFrm_Paint(null, null);
            Pen pen = new Pen(Color.Green, 2);
            pen.DashPattern = new float[] { 1, 2 };
            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
            main_g.DrawRectangle(pen, recX, recY, width, height);
            string ss = $"X:{recX},Y:{recY}\n width:{width},height:{height}";
            main_g.DrawString(ss, new Font("宋体", 12,FontStyle.Bold), Brushes.Red, new Point(10, 10));
        }
 
        private void CaptureFrm_Paint(object sender, PaintEventArgs e)
        {
            if (main_g == null) return;
          //  main_g.Clear(Color.WhiteSmoke);
            main_g.DrawImage(bcgImg, new Rectangle(0, 0, this.Width, this.Height), new Rectangle(0, 0, bcgImg.Width, bcgImg.Height), GraphicsUnit.Pixel);
           
        }
 
        private void CaptureFrm_DoubleClick(object sender, EventArgs e)
        {
           
        }
    }

到此这篇关于使用C#实现对任意区域任意大小的截图的文章就介绍到这了,更多相关C#截图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于C#实现Windows服务的方法详解

    基于C#实现Windows服务的方法详解

    在实际应用过程中,有时候我们希望开发的程序,不需要界面,直接开机就可以长时间运行,这时候,我们可以考虑做成一个Windows服务。这篇文章跟大家介绍一下,如何基于C#实现Windows服务的创建、安装、启动、停止和卸载,需要的可以参考一下
    2022-09-09
  • c# 获取网页中指定的字符串信息的实例代码

    c# 获取网页中指定的字符串信息的实例代码

    c# 获取网页中指定的字符串信息的实例代码,需要的朋友可以参考一下
    2013-04-04
  • C#使用自定义的泛型节点类实现二叉树类

    C#使用自定义的泛型节点类实现二叉树类

    这篇文章主要为大家详细介绍了C#如何使用自定义的泛型节点类 Node<T>实现二叉树类BinaryTree<T>及其方法,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • C#基础入门之值类型和引用类型的区别详析

    C#基础入门之值类型和引用类型的区别详析

    在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中,下面这篇文章主要给大家介绍了关于C#基础入门之值类型和引用类型区别的相关资料,需要的朋友可以参考下
    2021-09-09
  • C#数据结构揭秘一

    C#数据结构揭秘一

    本文一介绍了数据结构的基本概念 而介绍了算法的基本概念,并且重点讨论了算法时间复杂度,并且用程序予以证明
    2012-10-10
  • C#使用RegNotifyChangeKeyValue监听注册表更改的方法小结

    C#使用RegNotifyChangeKeyValue监听注册表更改的方法小结

    RegNotifyChangeKeyValue的最后一个参数传递false,表示以同步的方式监听,这篇文章主要介绍了C#使用RegNotifyChangeKeyValue监听注册表更改的方法小结,需要的朋友可以参考下
    2024-06-06
  • 详细介绍C#之文件校验工具的开发及问题

    详细介绍C#之文件校验工具的开发及问题

    目前校验文件使用最多的是MD值和SHA值,不外乎有些使用CRC,前段时间微软发布了VisualStudio正式版,win镜像,微软官方给出的校验方式都是校验文件的SHA值。下面详细介绍C#之文件校验工具的开发及问题,需要的朋友可以参考下
    2015-07-07
  • 深入c# GDI+简单绘图的具体操作步骤(二)

    深入c# GDI+简单绘图的具体操作步骤(二)

    本篇文章是对GDI+简单绘图的绘图知识进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#中的虚方法和抽象方法的运用

    C#中的虚方法和抽象方法的运用

    这篇文章主要介绍了C#中的虚方法和抽象方法的运用,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C# 8.0可空引用类型的使用注意记录

    C# 8.0可空引用类型的使用注意记录

    这篇文章主要给大家介绍了关于C# 8.0可空引用类型使用注意的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04

最新评论