Java实现找色和找图功能

某天,张三接到一个任务需求,将一个Excel表格里面的员工信息,录入到员工系统里面,由于数据量非常大,操作起来巨慢。经过一段时间的操作和观察,他发现这种操作,非常有规律,基本就是一些固定操作,无非换一下数据,于是他打算编写一段小程序实现这个功能,这样就能让程序干活,自己轻松一点,而且程序不知道累,只要电脑有电就行。

在这里插入图片描述

  在手动上传了上百条员工信息后,累的头昏眼花,张三开始了编码实现自动化操作,折腾了半天后,张三实现了Excel数据读取,每一行数据都可以成功读出来,接着程序切换窗口到已经登录的员工系统浏览器页面,准备将读取到的数据,逐个填写到表单里面。

工号姓名性别部门邮箱头像
1001赵一侍卫1001@m.com😃

  前面手动录入数据的操作,张三总结出了这套操作的规律,按tab键可以在各个输入框和单选框中移动,姓名等文本数据很快就确定好了解决方案,测试代码跑了几次,将读取到的数据顺利的填写到相应的输入框内,或选择合适的单选框。

  但是在选择头像的时候遇到了问题,因为要操作选择文件按钮,在本地硬盘选择对应的头像图片文件,选择完成头像图片之后,一系列数据和头像都准备好,提交按钮才会变成可点击状态,按钮颜色由灰色变为蓝色。

找色

  通过调用JDK提供的Robot类,填充完所有信息后,获取提交按钮在屏幕坐标的位置的颜色,判断是否可以点击,如果可以点击,点击提交就可以了。

  于是张三编码如下:

void inputEmployee(){
//......Robot robot = new Robot();//......//......填写各种信息//获取按钮坐标位置的颜色Color color = robot.getPixelColor(812, 670);int getColor = color.getRGB() & 0x00ffffff;int btnColor = 0x007bff;if (getColor == btnColor) {System.out.println("按钮可点击");robot.delay(300);//点击提交按钮robot.mouseMove(812, 670);robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);} else {System.out.println("按钮不可点击");}
}

  运行后测试了几次,效果不错。现在程序读取数据后自己逐个填写员工信息,最后点击提交,2秒后开始下一条数据的填写和提交。

找图

  程序运行了一段时间,张三发现在提交数据出现异常的情况,程序还在孜孜不倦的工作,这种情况问题很严重,容易遗漏数据。

  目前由于失败的情况比较复杂,临时人工处理一下,程序遇到提交失败先暂停,人工处理后再开始下一条。接下来得让程序判断提交结果是否成功,如果成功自动开始填写下一条员工信息。

  经过观察,提交成功会显示一个绿色小图标的成功提示,失败会显示一个红色小图标的错误提示。张三于是截取了一个包含成功提示的小图片,用微软画图mspaint简单去除了一下边缘空白,保存为一张png图片。接下来编写程序,在屏幕截图中查找这张小图片,如果查找到,就认为提交数据成功了,接着开始下一条数据的填写提交。

  接下来,张三编码如下

boolean findSuccess(){boolean found = false;try {// 加载小图BufferedImage smallImage = javax.imageio.ImageIO.read(new java.io.File("toast_ok.png"));Robot robot = new Robot();for (int i = 0; i < 8; i++) {robot.delay(200);Rectangle screenRect = new Rectangle(java.awt.Toolkit.getDefaultToolkit().getScreenSize());BufferedImage screenShot = robot.createScreenCapture(screenRect);// 这里将屏幕截图保存为文件,方便查看结果//javax.imageio.ImageIO.write(screenShot, "png", new java.io.File("screenshot6.png"));found = searchForImage(screenShot, smallImage);}} catch (AWTException | java.io.IOException e) {e.printStackTrace();}return found;
}private static void searchForImage(BufferedImage bigImage, BufferedImage smallImage) {int bigWidth = bigImage.getWidth();int bigHeight = bigImage.getHeight();int smallWidth = smallImage.getWidth();int smallHeight = smallImage.getHeight();for (int y = 0; y <= bigHeight - smallHeight; y++) {for (int x = 0; x <= bigWidth - smallWidth; x++) {if (isSubImageAt(bigImage, smallImage, x, y)) {System.out.println("小图在大图中的位置:(" + x + ", " + y + ")");return;}}}System.out.println("小图未在大图中找到。");
}private static boolean isSubImageAt(BufferedImage bigImage, BufferedImage smallImage, int x, int y) {for (int smallY = 0; smallY < smallImage.getHeight(); smallY++) {for (int smallX = 0; smallX < smallImage.getWidth(); smallX++) {int bigRGB = bigImage.getRGB(x + smallX, y + smallY);int smallRGB = smallImage.getRGB(smallX, smallY);if (bigRGB!= smallRGB) {return false;}}}return true;
}

运行测试后接过如下,看来没什么问题

小图未在大图中找到。
小图未在大图中找到。
小图未在大图中找到。
小图未在大图中找到。
小图未在大图中找到。
小图在大图中的位置:(937, 1017)
小图在大图中的位置:(937, 1017)
小图在大图中的位置:(937, 1017)

  接下来张三将程序完善了一下,把一些不变的对象提前创建好,避免不必要的对象创建,重新测试后功能正常,将这个逻辑加入后,程序就更稳定了,而且提交出现异常的情况不算多,这样一来,张三就基本实现了程序全自动读取提交员工信息,他自己接了杯茶,一边喝一边看着程序干活,偶尔处理一下失败的异常,非常惬意。

  晚上快下班的时候,10000条员工信息终于传完了,还好编写了个程序,不然,这一万条数据得把自己累死,而且今天还干不完。

  晚上张三和李四、周五聚餐,说了自己白天编写的程序上传信息的事情,李四询问了下他的实现过程,说:“其实,有一种更为激进的方法,分析一下信息提交的http通信过程,分析几次就能看出所有交互细节,然后直接调用Http相关API进行进行数据提交,协议级别要比操作UI更快。”

周五:“四哥说的对,不过我觉得三哥在模拟UI操作实现的情况下,一天完成这么多数据填写也是难能可贵了。”

李四:“没毛病,服务器那边的吴六请假了,要不然这个功能找他直接读取入库,还要快得多。”

周五:“不过三哥,你为什么不用按键精灵呢?用它编写这种脚本要方便快捷的多。”

张三:“主要是咱们有要求,软件库没有这种软件,不能使用”

周五:“也对,在条件有限的情况下也只能这样了,不过我听说调用OpenCV进行识图更加准确可靠,还有比如说一些文本识别可以调用一些成熟的OCR库来进行判断,也会更加可靠。”

李四:“你说的对”

三个人又交流了半天技术,李四说:“连上五天班太累了,周末咱们爬山去,锻炼锻炼”,其他两人纷纷同意,相约周末去爬山。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

huggingface的transformers与datatsets的安装与使用

目录 1.安装 2.分词 2.1tokenizer.encode&#xff08;&#xff09; 2.2tokenizer.encode_plus &#xff08;&#xff09; 2.3tokenizer.batch_encode_plus&#xff08;&#xff09; 3.添加新词或特殊字符 3.1tokenizer.add_tokens&#xff08;&#xff09; 3.2 token…

第L4周:机器学习-KNN总结-分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 概念&#xff1a; 在第L4周&#xff1a;机器学习-K-邻近算法模型&#xff08;KNN&#xff09;-CSDN博客中学习了KNN的基本概念&#xff0c;本次主要加深印象&a…

锐捷 NBR 1300G路由器 越权CLI命令执行漏洞

漏洞描述 锐捷NBR 1300G路由器 越权CLI命令执行漏洞&#xff0c;guest账户可以越权获取管理员账号密码 漏洞复现 FOFA title"锐捷网络 --NBR路由器--登录界面" 请求包 POST /WEB_VMS/LEVEL15/ HTTP/1.1 Host: Connection: keep-alive Content-Length: 73 Autho…

硬件设计-噪声的学习

目录 LDO 噪声和 PSRR ​编辑 噪声类型 数据表中的噪声规格 哪种规格适合您的应用 如何降低 LDO 噪声&#xff1f; LDO 噪声的影响 LDO 噪声和 PSRR 低压差线性稳压器 (LDO) 为调节由较高电压输入产生的输出电压提供了一种简单方法。虽然操作简单&#xff0c;但其自生噪…

如何禁止电脑上某个软件运行?电脑设置禁止运行软件的4个方法速成

在日常使用电脑的过程中&#xff0c;可能会遇到需要禁止某些软件运行的情况。 无论是为了防止员工随意使用与工作无关的软件&#xff0c;还是为了管理孩子的电脑使用时间&#xff0c;禁止特定软件运行都是有效的解决方案。 下面介绍4个速成方法&#xff0c;帮你轻松禁止电脑上…

QQ机器人搭建

使用QQ官方机器人Python SDK和三方框架搭建QQ群聊机器人 文章目录 使用QQ官方机器人Python SDK和三方框架搭建QQ群聊机器人前言编写机器人代码机器人监听群聊进行文字回复机器人监听群聊进行图片回复机器人监听群聊进行文件发送机器人监听群聊进行视频发送机器人监听群聊进行语…

3.js - 运动曲线

这个球&#xff0c;绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据&#xff0c;一系列的点&#xff0c;创建曲线 le…

【全新课程】正点原子《基于GD32 ARM32单片机项目实战入门》培训课程上线!

正点原子《基于GD32 ARM32单片机项目实战入门》全新培训课程上线啦&#xff01;正点原子工程师手把手教你学&#xff01;彻底解决ARM32单片机项目入门难的问题&#xff01; 一、课程介绍 本课程专为ARM32单片机的入门学习者设计&#xff0c;涵盖了环境搭建、编程软件使用、模…

ML 系列:机器学习和深度学习的深层次总结(08)—欠拟合、过拟合,正确拟合

ML 系列赛&#xff1a;第 9 天 — Under、Over 和 Good Fit 文章目录 一、说明二、了解欠拟合、过拟合和实现正确的平衡三、关于泛化四、欠拟合五、过拟合六、适度拟合七、结论 一、说明 在有监督学习过程中&#xff0c;对于指定数据集进行训练&#xff0c;训练结果存在欠拟合…

微软Win11 22H2/23H2 九月可选更新KB5043145发布!

系统之家于9月27日发出最新报道&#xff0c;微软针对Windows11系统&#xff0c;发布了九月最新可选更新补丁KB5043145&#xff0c;22H2用户安装后&#xff0c;系统版本号升至22621.4249&#xff0c;23H2用户安装后升至22631.4249。本次更新修复了Edge使用IE模式有时会停止响应等…

本地部署开源在线PPT制作与演示应用PPTist并实现异地远程使用

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统环境本地部署开源在线演示文稿应用PPTist&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问与使用该项目。 PPTist …

远程访问软路由

远程访问软路由主要涉及通过互联网从远程位置访问和控制基于软件的路由器系统。以下是远程访问软路由的一般方法&#xff1a; 一、远程访问软路由的方法 通过Web管理界面访问&#xff1a; 适用于大多数支持Web管理的软路由系统。用户只需在浏览器中输入软路由的公网IP地址或域…

[Linux#58][HTTP] 自己构建服务器 | 实现网页分离 | 设计思路

目录 一. 最简单的HTTP服务器 二.服务器 2.0 Protocol.hpp httpServer.hpp 子进程的创建和退出 子进程退出的意义 父进程关闭连接套接字 httpServer.cc argc (argument count) argv (argument vector) 三.服务器和网页分离 思考与补充&#xff1a; 一. 最简单的HTT…

ONFI 5.1:定义、缩写语和约定

address 该地址由一个行地址和一个列地址组成。行地址标识要访问的page、block和LUN。列地址标识要访问的page中的byte或word。 asynchronous 异步是指数据用WE_n信号进行写&#xff0c;RE_n信号进行读。 block 由多个page组成&#xff0c;是擦除操作的最小可寻址单元。 column…

安卓开发板_MTK开发板_联发科开发评估套件Demo板接口介绍

开发板是一种功能丰富的电路平台&#xff0c;专为开发人员设计&#xff0c;集成了多种传感器、扩展接口和通信模块。这使得开发者能够高效进行原型设计和功能验证&#xff0c;极大地简化了软硬件开发的过程。 此次介绍的安卓开发板由MT8788核心板与底板构成&#xff0c;特别之处…

OpenCV视频I/O(5)视频采集类VideoCapture之从视频流中获取下一帧的函数grab()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从视频文件或捕获设备中抓取下一帧。 grab() 函数是 OpenCV 中 VideoCapture 类的一个成员函数&#xff0c;用于从视频流中获取下一帧而不立即检…

AB plc设备数据 转profinet IO项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集AB PLC数据 2 5 用PROFINET IO协议转发数据 4 6 案例总结 7 1 案例说明 设置网关采集AB PLC数据把采集的数据转成profinet IO协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转换网关&#xff0…

Vue.js与Flask/Django全栈开发实战:从零搭建前后端分离的高效Web应用,打造现代化全栈开发体验!

将Vue.js与Flask或Django等后端框架配合使用&#xff0c;可以构建一个全栈的Web应用。以下是一个简要的指南&#xff0c;介绍如何将Vue.js与Flask或Django结合使用。 1. 准备工作 确保你已经安装了Node.js、npm&#xff08;或yarn&#xff09;以及Python和相应的包管理工具&am…

【系统交付资料】软件文档交付清单整理套用原件(Word,PPT,Excel)

软件文档交付清单是指在软件开发项目完成后&#xff0c;开发团队需要准备的一份详细清单&#xff0c;用于确保交付的软件产品符合客户需求并达到预期的质量标准。以下是软件文档交付清单中可能包含的一些关键要素 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&…

CSS的弹性盒子模型(Flex box)

弹性盒子模型是CSS3的一种新的布局模式&#xff0c;弹性盒是一种当页面需要适应不同的屏幕大小以及设备类型时确保拥有合适的布局方式&#xff0c;引入弹性盒子模型的目的时提供更加有效的方式来对一个容器中的子元素进行排列&#xff0c;对齐和分配空白空间。 弹性盒子由弹性容…