本文是利用C# 开发截图软件的小例子,以供学习分享使用。

思路:

  1. 截取屏幕图片。
  2. 获取要截取的范围,即左上角,右下角坐标
  3. 填充到PictureBox中。
  4. 笔触功能,荧光笔,矩形,橡皮擦,复制,保存功能

涉及的知识点:

  • MenuStrip:为窗体提供菜单系统。以ToolStripMenuItem为菜单子选项
  • ToolStrip:为 Windows 工具栏对象提供容器。以ToolStripButton【表示包含文本和图像的可选】为工具栏子元素
  • PictureBox:表示用于显示图像的 Windows 图片框控件。不过本文对此空间进行了重写
  • Screen:可用于获取工作屏幕区域
  • Graphics:封装一个 GDI+ 绘图图面。此类不能被继承。此类的CopyFromScreen方法用于获取屏幕图像
  • 鼠标事件:包括MouseDown,MouseMove,MouseUp事件,通过MouseEventArgs中的Location获取鼠标的位置。
  • Clipboard: 提供将数据置于系统剪贴板中以及从中检索数据的方法。此类不能被继承。
  • Cursor:设置鼠标的显示的光标的样式。
  • OnPaint:重绘事件,当控件刷新时响应此事件。

效果图

如下【主要实现了截图,保存,复制,画矩形,笔触,荧光笔,橡皮擦等功能】:

保存后图片如下:

-------------------------------------------------------------------------------------------------------------------------------

核心代码如下:

截取屏幕图像:

 1 public Bitmap GetScreen()
 2         {
 3             //获取整个屏幕图像,不包括任务栏
 4             Rectangle ScreenArea = Screen.GetWorkingArea(this);
 5             Bitmap bmp = new Bitmap(ScreenArea.Width, ScreenArea.Height);
 6             using (Graphics g = Graphics.FromImage(bmp))
 7             {
 8                 g.CopyFromScreen(0, 0, 0, 0, new Size(ScreenArea.Width,ScreenArea.Height));
 9             }
10             return bmp;
11         }

View Code

绘制图形功能:

  1 #region 绘制功能
  2
  3         protected override void OnPaint(PaintEventArgs pe)
  4         {
  5             base.OnPaint(pe);
  6             Graphics g = pe.Graphics;
  7             DrawHistory(g);
  8             //绘制当前线
  9             if (startDraw && this.curLine.PointList != null && this.curLine.PointList.Count > 0)
 10             {
 11                 DrawLine(g,this.curLine);
 12             }
 13             if (startDraw && this.curRect.Start != null && this.curRect.End != null && this.curRect.Start != this.curRect.End) {
 14                 DrawRectangle(g, this.curRect);
 15             }
 16         }
 17
 18         public void DrawHistory(Graphics g) {
 19             //绘制线历史记录
 20             if (LineHistory != null)
 21             {
 22                 foreach (HLine lh in LineHistory)
 23                 {
 24                     if (lh.PointList.Count > 10)
 25                     {
 26                         DrawLine(g, lh);
 27                     }
 28                 }
 29             }
 30             //绘制矩形历史记录
 31             if (RectHistory != null)
 32             {
 33                 foreach (HRectangle lh in RectHistory)
 34                 {
 35                     if (lh.Start!=null&& lh.End!=null && lh.Start!=lh.End)
 36                     {
 37                         DrawRectangle(g, lh);
 38                     }
 39                 }
 40             }
 41         }
 42
 43         /// <summary>
 44         /// 绘制线
 45         /// </summary>
 46         /// <param name="g"></param>
 47         /// <param name="line"></param>
 48         private void DrawLine(Graphics g,HLine line) {
 49             g.SmoothingMode = SmoothingMode.AntiAlias;
 50             using (Pen p = new Pen(line.LineColor, line.LineWidth))
 51             {
 52                 //设置起止点线帽
 53                 p.StartCap = LineCap.Round;
 54                 p.EndCap = LineCap.Round;
 55
 56                 //设置连续两段的联接样式
 57                 p.LineJoin = LineJoin.Round;
 58                 g.DrawCurve(p, line.PointList.ToArray()); //画平滑曲线
 59             }
 60         }
 61
 62         /// <summary>
 63         /// 绘制矩形
 64         /// </summary>
 65         /// <param name="g"></param>
 66         /// <param name="rect"></param>
 67         private void DrawRectangle(Graphics g, HRectangle rect)
 68         {
 69             g.SmoothingMode = SmoothingMode.AntiAlias;
 70             using (Pen p = new Pen(rect.LineColor, rect.LineWidth))
 71             {
 72                 //设置起止点线帽
 73                 p.StartCap = LineCap.Round;
 74                 p.EndCap = LineCap.Round;
 75
 76                 //设置连续两段的联接样式
 77                 p.LineJoin = LineJoin.Round;
 78                 g.DrawRectangle(p, rect.Start.X, rect.Start.Y, rect.End.X - rect.Start.X, rect.End.Y - rect.Start.Y); //画平滑曲线
 79             }
 80         }
 81
 82         public void Earser(Point p0)
 83         {
 84             for (int i = lineHistory.Count - 1; i >= 0; i--)
 85             {
 86                 HLine line = lineHistory[i];
 87                 bool flag = false;
 88                 foreach (Point p1 in line.PointList)
 89                 {
 90                     double distance = GetDistance(p0, p1);
 91                     if (Math.Abs(distance) < 6)
 92                     {
 93                         //需要删除
 94                         flag = true;
 95                         break;
 96                     }
 97
 98                 }
 99                 if (flag)
100                 {
101                     lineHistory.RemoveAt(i);
102                 }
103             }
104             //擦除矩形
105             for (int i = rectHistory.Count - 1; i >= 0; i--)
106             {
107                 HRectangle rect = rectHistory[i];
108
109                 if (p0.X>rect.Start.X && p0.X<rect.End.X && p0.Y > rect.Start.Y && p0.Y < rect.End.Y) {
110
111                     rectHistory.RemoveAt(i);
112                 }
113             }
114         }
115
116         /// <summary>
117         /// 获取两点之间的距离
118         /// </summary>
119         /// <param name="p0"></param>
120         /// <param name="p1"></param>
121         /// <returns></returns>
122         private double GetDistance(Point p0, Point p1) {
123             return Math.Sqrt(Math.Pow((p0.X - p1.X), 2) + Math.Pow((p0.Y - p1.Y), 2));
124         }
125
126         #endregion

View Code

以下是源码功能连接,需要的朋友可以自行下载。

源码链接

转载于:https://www.cnblogs.com/hsiang/p/6986621.html

C# 实现截图软件功能相关推荐

  1. 在CentOS 6.6 64bit上安装截图软件shutter

    系统自带的截图软件功能太有限,如何才能在CentOS 6.6 x86_64上安装shutter截图软件呢? 网上一些方法都不是很详细,无法安装成功,下面是我摸索的结果,记录如下: 问题:我想要在我的C ...

  2. 一款超好用的截图软件Snipaste

    虽然电脑和QQ本身就自带了截图软件了,但是这款截图软件功能特别强大,下面给大家介绍一下Snipaste: 下载方式:微软商店里就有了 功能: 具有涂鸦,打马赛克,写文字,保存,复制功能,相较于电脑自带 ...

  3. 示波器截图软件SWcopy(V1.3.10)

     使用示波器的测量完成后,要保留测量结果,最好的办法是截图. 一般截图有几种方式: 1.使用U盘保存,但是一来一回,浪费了很多时间,而截图多了,后期又难以区分管理 2.使用手机拍照,截图快,但是后 ...

  4. Windows/Linux 下功能强大的桌面截图软件

    说到桌面截图软件,很多人首先想到的是 QQ 自带的截图,或者更高级功能更强大的 Snipaste 截图工具. 独立版本的 QQ 截图至少我目前没找到官方正式的下载链接,默认需要安装和打开 QQ 才能使 ...

  5. Snagit 12 – 功能强的老牌截图软件

    老牌截图软件 Snagit 12 新版正式发布,相比旧版,Snagit 12 界面变得更加简洁,深色的配色增加了专业感,也更加舒服. 在功能上,Snagit 大幅简化了用户体验,不需要复杂的操作,只需 ...

  6. Linux/Ubuntu 18.04 截图软件Shutter详细教程,包括启用图片编辑Edit功能,延时截图等

    目录 Linux/Ubuntu 18.04 截图软件Shutter详细教程,包括启用Edit功能,延时截图等 安装Shutter 指令介绍 设置常用快捷键 启用Edit功能 延时截图 方法1 方法2 ...

  7. 编程沉思-做一款小巧而好用的截图软件

    效果图,为了减少图片大小,比例进行了相应的缩减. 第一节:介绍一下我的作品 图片左上角的exe就是我的截图软件,双击打开软件. 1.等待两秒,截图软件启动的时候首先隐藏自己并截取完整的屏幕,2秒后替代 ...

  8. opengl用什么软件写_汇才论文工具分享:写科研论文的都在用这些截图软件

    截图是一种学问,经常混迹论坛的相信都知道,"饶老师教你截图"的梗.由于经常有网友不使用系统自带的截图功能非要发手机屏拍的图,导致像素过低看不清,于是渐渐就行成了一种吐槽的梗,常见于 ...

  9. 制作类似QQ截图软件

    最近在学习GDI,发现网上几篇文章在讲截图软件制作方法,学习了一点知识,在这里分享一下. 主要是调用WinAPI中的函数来完成主要功能.关键的函数有2个,一个是CreateDC,利用这个函数来创建一个 ...

  10. 重新学习Ubuntu -- 截图软件的选择和安装

    前面两篇完成了:系统的安装和系统安装后的优化. 截图软件 shutter flameshot 这个根据自己原来的学习经验和网上的相关资料来完成截图软件的安装.参照文章: shutter :Ubuntu ...

最新文章

  1. 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本
  2. 查找文件命令find总结以及查找大文件
  3. 【转载】一个男人关心的东西 决定了他的层次
  4. 微软发布紧急更新:修复Flash高危漏洞
  5. .net平台是什么?.net平台的组成,.net平台的好处
  6. parfor —— matlab 下的并行循环
  7. matlab建立子程序,怎么实现matlab子程序的放置以及调用
  8. ARP网关欺骗原理及解决办法
  9. 归并算法Java实现
  10. spring boot整合第三方微信开发工具 weixin-java-miniapp 实现小程序微信登录
  11. Android的MVP架构
  12. 黑苹果开启——HiDPI 技术
  13. poj1125 Stockbroker Grapevine Floyd算法
  14. 【C语言】如何去求最大公约数和最小公倍数?
  15. 计算机博士5篇sci,8篇SCI论文,5篇TOP期刊——一个博士的独白
  16. [英] Get More Done In Less Time
  17. 网络安全设备配置交换机
  18. [转载]蓝沙快克PXE网克图文教程
  19. 安装itunes时提示不能删除旧版本的apple应用程序支持
  20. slam算法_[招聘] SLAM算法工程师

热门文章

  1. 如何在被保护的工作表(Worksheet)中使用Group Outlining
  2. 斐讯AI音箱怎么绑定扫地机器人_斐讯智能音箱常见问题解答
  3. 腾讯 AI Lab 2020 年度回顾
  4. 汽车计算机英语词汇,汽车专用英语词汇?
  5. 【分享】新品TI AM5708开发板!DSP+ARM异构多核!相比OMAP-L138,性能升级;相比AM5728,成本优化、功耗更低!
  6. linux 服务器共享文件客户端查看,在Linux下查看共享文件夹
  7. 福利贴——爬取美女图片的Java爬虫小程序代码
  8. 如何在台式电脑上添加无线网络连接服务器,台式电脑怎么无线上网?台式电脑无线网络设置教程...
  9. semilogx 多条曲线_如何在excel中绘制多条曲线
  10. Iptables入门