首页 > 学院 > 开发设计 > 正文

截图工具——涂鸦

2019-11-08 02:04:23
字体:
来源:转载
供稿:网友

具有椭圆、矩形、箭头、画笔、文字涂鸦功能的截图工具,效果如图: 这里写图片描述

思路: 用泛型集合存储涂鸦的数据,每一次涂鸦后都存储进去,最后在OnPaint中遍历该集合,通过GDI绘出。

重点讲涂鸦部分: 1、椭圆、矩形、箭头,都只需确定起点和终点。 2、画笔需要确定点集合。 3、文字涂鸦通过透明Richtextbox写上内容后区域截屏成一个bitmap。

实现方法: 涂鸦通过GDI画图实现:

PRivate void DrawTools(Graphics g, DrawToolData data) { Point beginPoint = data.beginPoint; Point endPoint = data.endPoint; ColorToolChose(); Rectangle rect = GetToolRect(beginPoint, endPoint); Pen pen = new Pen(data.penColor, data.penWidth); g.SmoothingMode = SmoothingMode.AntiAlias; switch (data.Type) { case 1://椭圆 using (pen) { g.DrawEllipse(pen, rect); } break; case 2://矩形 using (pen) { g.DrawRectangle(pen, rect); } break; case 3://箭头 using (pen) { pen.EndCap = LineCap.ArrowAnchor; pen.EndCap = LineCap.Custom; pen.CustomEndCap = new AdjustableArrowCap(4, 4, true); g.DrawLine(pen, beginPoint, endPoint); } break; case 4://画笔 if (data.pointList.Count < 2) return; Point[] points = data.pointList.ToArray(); using (pen) { g.DrawLines(new Pen(data.penColor, data.penWidth), points); } break; case 5://文字 if (data.textBmp.Width < 2) return; g.DrawImage(data.textBmp, data.beginPoint); break; } }

写一个类用来存储涂鸦数据,然后用“List<>” 把每一次涂鸦的数据存起来。

//存储画笔工具 所有线段的 点集合、画笔颜色宽度的类 的集合private List<DrawToolData> drawData = new List<DrawToolData>(); /// <summary> /// 存储画图信息 /// </summary>public class DrawToolData { public int Type { get; set; } = 0; /// <summary> /// 画笔工具线段点集合 /// </summary> public List<Point> pointList { get; set; } = new List<Point>(); public Color penColor { get; set; } public int penWidth { get; set; } public Point beginPoint { get; set; } = Point.Empty; public Point endPoint { get; set; } = Point.Empty; public float textSize { get; set; } = 16; //存文字分割后的字符串数组 public string textInfo { get; set; } public Bitmap textBmp { get; set; } = new Bitmap(1, 1); }

每次画完一个图形后都调用存储数据的方法,存储到数据集合的末尾。

private void addDrawData() { if (drawData.Count == 0) drawData.Add(new DrawToolData()); drawData[drawData.Count - 1].Type = clickType; drawData[drawData.Count - 1].penColor = selectedColor; drawData[drawData.Count - 1].penWidth = penWidth; switch (clickType) { case 1: case 2: case 3: drawData[drawData.Count - 1].beginPoint = BeginPoint; drawData[drawData.Count - 1].endPoint = EndPoint; break; case 4: (drawData[drawData.Count - 1].pointList).Add(EndPoint); break; case 5: drawData[drawData.Count - 1].beginPoint = BeginPoint; drawData[drawData.Count - 1].textSize = colorWithText1.textSize; drawData[drawData.Count - 1].textInfo = drawTextTool1.Text; drawData[drawData.Count - 1].textBmp = GetTextBmp(); break; }

最后在OnPaint中遍历数据画出图形。

foreach (DrawToolData data in drawData) { DrawTools(g, data); }

文字涂鸦:做一个透明的RichtextBox控件(百度一下),然后截屏CopyFromScreen,得到bitmap。

/// <summary> /// 得到文字涂鸦的图片 /// </summary> private Bitmap GetTextBmp() { Bitmap bmp = new Bitmap(drawTextTool1.Width, drawTextTool1.Height); Graphics g = Graphics.FromImage(bmp); Point point = new Point(drawTextTool1.Location.X + this.Location.X + myLocation.X, drawTextTool1.Location.Y + this.Location.Y + myLocation.Y); g.CopyFromScreen(point, Point.Empty, drawTextTool1.Size); return bmp; }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表