C# 实现截图功能的操作实例
思路:
截取屏幕图片。
获取要截取的范围,即左上角,右下角坐标
填充到PictureBox中。
笔触功能,荧光笔,矩形,橡皮擦,复制,保存功能
涉及的知识点:
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.Xrect.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 #endregionView Code
以上就是C# 实现截图功能的操作实例的详细内容,更多请关注其它相关文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: C# 实现截图功能的操作实例
本文地址: https://pptw.com/jishu/592476.html