最近在使用屏幕截图工具的时候发现放大镜的功能有点小问题,准星和实际鼠标位置对不上,取到的颜色并不鼠标所在的点颜色,所以去看“C#软件开发实例.私人订制自己的屏幕截图工具(七)添加放大镜的功能”的代码,发现之前的代码实现效率上应该有问题,所以就试试优化了一下,经过对比相差十几倍。

之前的算法逻辑是:

1、根据放大镜的大小计算需要的原图尺寸,复制到新建的Bitmap;

2、创建一个新的Bitmap保存放大后的图片;

3、采用四层循环通过“GetPixel”获得源像素颜色,通过“SetPixel”设置放大后目标区域颜色;

优化后的逻辑:

1、根据放大镜的大小计算需要的原图尺寸,获取原图在整个屏幕图片上的坐标点;

2、声明单像素放大的区域“zoomRect”,1:10放大,所以Reatangle大小是10*10;

3、声明画笔对象;

4、双层循环,直接从屏幕图片上取像素点的颜色,通过“FillRectangle”方法对像素进行放大绘制到放大镜的对应显示区域;

优化后的代码:

                long drawBegin = DateTime.Now.Ticks;//绘制放大镜中的图像int infoAreaHeight = 32;Size srcSize = new System.Drawing.Size((int)(this.ZoomBoxWidth / 10), (int)(this.ZoomBoxHeight / 10));Point srcPoint = new Point(MousePosition.X - 5, MousePosition.Y - 4);if (!isCuting){label1.Text = "!isCuting";srcPoint = new Point(MousePosition.X - 6, MousePosition.Y - 5);}Rectangle zoomRect  = new Rectangle(0, 0, 10, 10);Brush zoomBrush;for (int row = 0; row < srcSize.Height; row++){for (int col = 0; col < srcSize.Width; col++){Color pc = screenImage.GetPixel(srcPoint.X + col, srcPoint.Y + row);zoomBrush = new SolidBrush(pc);e.Graphics.FillRectangle(zoomBrush, zoomRect);zoomRect.Offset(10, 0);}zoomRect.Offset(0, 10);zoomRect.X = 0;}//绘制放大镜的准星int blockX = e.ClipRectangle.Width / 2;int blockY = (e.ClipRectangle.Height - infoAreaHeight) / 2;SolidBrush brush = new SolidBrush(Color.FromArgb(10, 124, 202));Pen pen = new Pen(brush, 2.0F);e.Graphics.DrawLine(pen, new Point(0, blockY + 5), new Point(e.ClipRectangle.Width, blockY + 5)); //加5解决放大镜准星和实际鼠标位置对不上的问题;e.Graphics.DrawLine(pen, new Point(blockX, 0), new Point(blockX, e.ClipRectangle.Height - infoAreaHeight));//绘制信息区墨色背景Rectangle rectInfo = new Rectangle(0, e.ClipRectangle.Height - infoAreaHeight, e.ClipRectangle.Width, infoAreaHeight);brush = new SolidBrush(Color.FromArgb(51, 51, 51));e.Graphics.FillRectangle(brush, rectInfo);//计算截图区域的大小if (this.lbl_CutImage.Visible){this.areaSize = new System.Drawing.Size(this.lbl_CutImage.Width - 4, this.lbl_CutImage.Height - 4);if (this.areaSize.Width < 1) { this.areaSize.Width = 1; }if (this.areaSize.Height < 1) { this.areaSize.Height = 1; }}else{this.areaSize = rect_WindowFromPoint.Size;}//绘制截取区域大小brush = new SolidBrush(Color.White);Font font = new System.Drawing.Font(FontFamily.GenericSerif, 12.0F, GraphicsUnit.Pixel);string str = this.areaSize.Width + " x " + this.areaSize.Height;e.Graphics.DrawString(str, font, brush, new PointF(5, rectInfo.Top + 1));//绘制鼠标指针位置的颜色this.cRGB = screenImage.GetPixel(MousePosition.X, MousePosition.Y);str = "RGB:#" + this.cRGB.R.ToString("X").PadLeft(2, '0') + this.cRGB.G.ToString("X").PadLeft(2, '0') + this.cRGB.B.ToString("X").PadLeft(2, '0');e.Graphics.DrawString(str, font, brush, new PointF(5, rectInfo.Top + 15));label1.Text = "," + (DateTime.Now.Ticks - drawBegin);Application.DoEvents();

效率检测方法:

//在要测试的代码前添加变量记录时间
long drawBegin = DateTime.Now.Ticks;
//中间为要测试的代码
//在要测试的代码后添加代码显示时间差
label1.Text = "," + (DateTime.Now.Ticks - drawBegin);
Application.DoEvents();

小结

这里有这样几个优化点:

1、省去两个Bitmap对象,就省去两次绘制开销;

2、四层循环改为两层循环,计算量减小;

3、使用“FillRectangle”方法代替“SetPixel”;

本项目完整源码请参考:【拥抱开源】十年之做C#屏幕截图工具全面开源

======================文档信息===========================

版权声明:非商用自由转载-保持署名-注明出处

署名(BY) :testcs_dn(微wx笑)

文章出处:[无知人生,记录点滴](http://blog.csdn.net/testcs_dn)

C#软件开发实例.私人订制自己的屏幕截图工具——放大镜的功能代码优化相关推荐

  1. C#软件开发实例.私人订制自己的屏幕截图工具(七)添加放大镜的功能

    本实例全部文章目录 (一)功能概览 (二)创建项目.注册热键.显示截图主窗口 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)添加配置管理功能 (七)添加 ...

  2. C#软件开发实例.私人订制自己的屏幕截图工具(九)使用自定义光标,QQ截图时的光标

    本实例全部文章目录 (一)功能概览 (二)创建项目.注册热键.显示截图主窗口 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)添加配置管理功能 (七)添加 ...

  3. C#软件开发实例.私人订制自己的屏幕截图工具(一)功能概览

    本实例全部文章目录 (一)功能概览 (二)创建项目.注册热键.显示截图主窗口 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)添加配置管理功能 (七)添加 ...

  4. C#软件开发实例.私人订制自己的屏幕截图工具(十)在截图中包括鼠标指针形状...

    本实例所有文章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加 ...

  5. C#软件开发实例.私人订制自己的屏幕截图工具(十)在截图中包含鼠标指针形状

    本实例全部文章目录 (一)功能概览 (二)创建项目.注册热键.显示截图主窗口 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)添加配置管理功能 (七)添加 ...

  6. Android软件开发实例:用客户端写博客

    标题:在Android上通过客户端写博客软件开发实例 作者:肖凤斌 binsweet@gmail.com 关注Android很久了,年初买了G4,但一直没有机会尝试Android上的软件开发. 自己有 ...

  7. openCPU-EC600简介与软件开发实例小结

    openCPU-EC600简介与软件开发实例小结 咸鱼NO FASHION EC600系列包含EC600S.EC600N.EC600U等.具体差异如下: 1.EC600S包含2G+4G,单4G模组(9 ...

  8. 详解AUTOSAR:汽车软件开发V模型过程中AUTOSAR工具链的应用(工具篇—1)

    目录 1.PREEvision 2.vVIRTUALtarget 3.DaVinci Developer 4.DaVinci Configurator 5.CANoe 6.VT System 7.CA ...

  9. iPhone拍照/摄像软件开发实例

    原帖地址  http://www.cocoachina.com/bbs/read.php?tid-11618.html 这个App基于lolfriend的源码改写,完全使用官方API.目前还没实现的功 ...

最新文章

  1. 【技巧】解决win10的1803版本下,无法收到1809推送、从而无法更新到1903版本的问题。...
  2. 五.几何对象和空间参考
  3. 31-- 二叉搜索树的范围和
  4. Linux 删除权限 umask,linux中的umask控制文件或目录的默认权限
  5. 使用Xmanger登陆aix系统桌面时报桌面服务DT未启动问题
  6. 在线文本行固定长度填充工具
  7. android ble 发送指令,Android – 如何通过蓝牙低能耗(BLE)链接发送数据?
  8. 【服务器】微信小程序转qq小程序
  9. 力扣-剑指Offer-57 和为s的连续正数序列
  10. 关于Idea模块化部署web项目,Web Resource Directories作用
  11. springmvc form中 commandName和modelAttribute的疑问
  12. 计算机类团队名称大全,团队名字大全好听
  13. MaxCompute SQL引用第三方Base64JAR实现编解码
  14. 虚拟机查看HWADDR(即MAC)地址
  15. 数据分析师是热门职业么?转行容易么?
  16. html 文件常用格式
  17. vol.169 垃圾分类的技术现实意义
  18. 开源虚拟机Bochs安装以及踩坑
  19. 体验高空跳伞,3DMark Sky Drive场景测试
  20. 机械复试面试问题汇总1

热门文章

  1. HTML:路径的写法
  2. python刷火车票脚本_使用python脚本实现查询火车票工具
  3. 钉钉群机器人消息通知
  4. 最短路径—— Til the Cows Come Home
  5. BT.656标准简介-内同步并口-以及波形测量
  6. SSL证书一年需要多少钱
  7. Python VTK numpy数据3D可视化
  8. 80核处理器_80多岁仍奋战一线,龙芯巾帼英雄黄令仪获CCF夏培肃奖
  9. php 作业 的背景,新课课程背景下中学语文作业布置的思考(网友来稿)a href=/friend/list.php(教师中心专稿)/a...
  10. 域名解析不生效的原因及排查方法