C#软件开发实例.私人订制自己的屏幕截图工具——放大镜的功能代码优化
最近在使用屏幕截图工具的时候发现放大镜的功能有点小问题,准星和实际鼠标位置对不上,取到的颜色并不鼠标所在的点颜色,所以去看“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#软件开发实例.私人订制自己的屏幕截图工具——放大镜的功能代码优化相关推荐
- C#软件开发实例.私人订制自己的屏幕截图工具(七)添加放大镜的功能
本实例全部文章目录 (一)功能概览 (二)创建项目.注册热键.显示截图主窗口 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)添加配置管理功能 (七)添加 ...
- C#软件开发实例.私人订制自己的屏幕截图工具(九)使用自定义光标,QQ截图时的光标
本实例全部文章目录 (一)功能概览 (二)创建项目.注册热键.显示截图主窗口 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)添加配置管理功能 (七)添加 ...
- C#软件开发实例.私人订制自己的屏幕截图工具(一)功能概览
本实例全部文章目录 (一)功能概览 (二)创建项目.注册热键.显示截图主窗口 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)添加配置管理功能 (七)添加 ...
- C#软件开发实例.私人订制自己的屏幕截图工具(十)在截图中包括鼠标指针形状...
本实例所有文章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加 ...
- C#软件开发实例.私人订制自己的屏幕截图工具(十)在截图中包含鼠标指针形状
本实例全部文章目录 (一)功能概览 (二)创建项目.注册热键.显示截图主窗口 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)添加配置管理功能 (七)添加 ...
- Android软件开发实例:用客户端写博客
标题:在Android上通过客户端写博客软件开发实例 作者:肖凤斌 binsweet@gmail.com 关注Android很久了,年初买了G4,但一直没有机会尝试Android上的软件开发. 自己有 ...
- openCPU-EC600简介与软件开发实例小结
openCPU-EC600简介与软件开发实例小结 咸鱼NO FASHION EC600系列包含EC600S.EC600N.EC600U等.具体差异如下: 1.EC600S包含2G+4G,单4G模组(9 ...
- 详解AUTOSAR:汽车软件开发V模型过程中AUTOSAR工具链的应用(工具篇—1)
目录 1.PREEvision 2.vVIRTUALtarget 3.DaVinci Developer 4.DaVinci Configurator 5.CANoe 6.VT System 7.CA ...
- iPhone拍照/摄像软件开发实例
原帖地址 http://www.cocoachina.com/bbs/read.php?tid-11618.html 这个App基于lolfriend的源码改写,完全使用官方API.目前还没实现的功 ...
最新文章
- 【技巧】解决win10的1803版本下,无法收到1809推送、从而无法更新到1903版本的问题。...
- 五.几何对象和空间参考
- 31-- 二叉搜索树的范围和
- Linux 删除权限 umask,linux中的umask控制文件或目录的默认权限
- 使用Xmanger登陆aix系统桌面时报桌面服务DT未启动问题
- 在线文本行固定长度填充工具
- android ble 发送指令,Android – 如何通过蓝牙低能耗(BLE)链接发送数据?
- 【服务器】微信小程序转qq小程序
- 力扣-剑指Offer-57 和为s的连续正数序列
- 关于Idea模块化部署web项目,Web Resource Directories作用
- springmvc form中 commandName和modelAttribute的疑问
- 计算机类团队名称大全,团队名字大全好听
- MaxCompute SQL引用第三方Base64JAR实现编解码
- 虚拟机查看HWADDR(即MAC)地址
- 数据分析师是热门职业么?转行容易么?
- html 文件常用格式
- vol.169 垃圾分类的技术现实意义
- 开源虚拟机Bochs安装以及踩坑
- 体验高空跳伞,3DMark Sky Drive场景测试
- 机械复试面试问题汇总1
热门文章
- HTML:路径的写法
- python刷火车票脚本_使用python脚本实现查询火车票工具
- 钉钉群机器人消息通知
- 最短路径—— Til the Cows Come Home
- BT.656标准简介-内同步并口-以及波形测量
- SSL证书一年需要多少钱
- Python VTK numpy数据3D可视化
- 80核处理器_80多岁仍奋战一线,龙芯巾帼英雄黄令仪获CCF夏培肃奖
- php 作业 的背景,新课课程背景下中学语文作业布置的思考(网友来稿)a href=/friend/list.php(教师中心专稿)/a...
- 域名解析不生效的原因及排查方法