Java实现找色和找图功能

news2024/11/18 3:33:05

某天,张三接到一个任务需求,将一个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.coloradmin.cn/o/2174018.html

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

相关文章

html+css+js实现Pagination 分页

效果图 HTML部分 <body><div class"pagination"><button class"prev"><</button><ul><li class"active">1</li><li>2</li><li>3</li><li>4</li><li>5…

基于springboot+vue+mysql公益旧物捐赠系统(源码+参考文档+定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

3d可视化图片:通过原图和深度图实现

1、depthy 在线体验demo: https://depthy.stamina.pl/#/ 也可以docker安装上面服务: docker run --rm -t -i -p 9000:9000 ndahlquist/depthy http://localhost:90001)首先传原图 2)再传对应深度图 3)效果

云栖大会观察:云计算第三次浪潮下的暗流涌动

如果跳脱出今年云栖大会的“云启智跃产业蝶变”、“云计算第三次浪潮”这些设定好的视角&#xff0c;站在“AI有着太多的未知性”这个角度观察这次大会&#xff0c;会看到什么&#xff1f; 我们会看到&#xff0c;对于现在的阿里云而言&#xff0c;AI带来的并非都是机遇&#…

【Gitee自动化测试4】本地Git分支的增删查,本地Git分支中文件的增删查,本地文件的暂存/提交,本地分支的推送

一、流程 本地创建分支&#xff0c;设定连接什么云分支本地创建文件&#xff0c;暂存、提交–>本地分支本地分支推送所有修改–>云仓库 二、分支概念 在版本回退里&#xff0c;每次提交&#xff0c;git都把它们串成一条时间线&#xff0c;这条时间线可以理解为是一个分…

Meta Sapiens 人体AI模型

Meta 一直是开发图像和视频模型的领导者&#xff0c;现在他们又增加了一个新东西&#xff1a;Meta Sapiens。和Homo sapiens一样&#xff0c;这个模型也是关于人类的。它旨在执行与人类相关的任务&#xff0c;例如理解身体姿势、识别身体部位、预测深度&#xff0c;甚至确定皮肤…

小学三年级数学拓展填空题

用传统思维来看小学的学习是错误的。 学校考核老师主要看学生成绩&#xff0c;导致学生作业很多。 而且&#xff0c;现在的中小学生是不是太卷了&#xff1f;都开始卷远超过自己年龄阶段应该掌握的内容了&#xff1f;——这才是很不正常的现象。 如果大家都这么卷&#xff0c…

自然资源部最新Nature正刊!!!

2024年8月21日&#xff0c;国际顶级期刊《Nature》发表了自然资源部第二海洋研究所李家彪院士为通讯作者&#xff0c;张涛为第一作者的论文“超慢速扩张加克洋中脊的高变化岩浆增生”。这一成果颠覆了国际海洋学术界半个多世纪以来一直认为的超慢速扩张洋中脊岩浆供给极度贫瘠的…

9--苍穹外卖-SpringBoot项目中Redis的介绍及其使用实例 详解

目录 Redis入门 Redis简介 Redis服务启动与停止 服务启动命令 Redis数据类型 5种常用数据类型介绍 各种数据类型的特点 Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在java中操作Redis Redis的Java客户端 …

excel统计分析(4): 多元线性回归分析

用途&#xff1a;研究多个自变量&#xff08;也称为预测变量或解释变量&#xff09;与一个因变量&#xff08;也称为响应变量&#xff09;之间的线性关系。 多元线性回归分析模型&#xff1a;Yβ0β1X1β2X2…βkXkϵ Y 是因变量。1,X2,…,Xk 是自变量。β0 是截距项。β1,β2,…

ROSTCM6+Gephi的网络语义分析详细教程(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

经济不好,但是遍地都是赚钱的机会

现在职场越来越内卷&#xff0c;裁员风波也是不断&#xff0c;前些天看到一个帖子&#xff0c;裁员都裁到应届生头上了。 都说00后整治职场&#xff0c;在如今环境下也要掂量一下了。 大家都在抱怨环境&#xff0c;可是你有没有想过&#xff0c;有些人在闷声发着小财。 下面…

vue2 vconsole有助于移动端开发页面调试

项目场景&#xff1a; pc项目开发中&#xff0c;有浏览器自带的调试工具。但在移动端&#xff0c;就需要自己搭建调试工具了。vconsole一种非常方便的前端调试依赖库&#xff0c;有助于我们在移动端开发式进行调试&#xff0c;快速排查移动端问题。 搭建步骤 1、安装依赖库。…

让具身智能更快更强!华东师大上大提出TinyVLA:高效视觉-语言-动作模型,遥遥领先

论文链接&#xff1a;https://arxiv.org/pdf/2409.12514 项目链接&#xff1a;https://tiny-vla.github.io/ 具身智能近期发展迅速&#xff0c;拥有了大模型"大脑"的机械臂在动作上更加高效和精确&#xff0c;但现有的一个难点是&#xff1a;模型受到算力和数据的制…

探索基因奥秘:汇智生物如何利用组蛋白甲基化修饰测序技术革新农业植物基因组研究?

引言&#xff1a; 随着生物医学技术的不断进步&#xff0c;我们对生命奥秘的探索越来越深入。在众多的生物技术中&#xff0c;表观组学分析技术逐渐成为研究的热点。本文将带您走进汇智生物&#xff0c;了解他们如何利用DNA亲和纯化测序技术&#xff08;DAP-seq&#xff09;推…

Android开发TextView内容从右到左滚动

Android开发TextView内容从右到左滚动 这个功能比较简单&#xff0c;TextView内容从右到左滚动 一、思路&#xff1a; 用TextView的marqueeRepeatLimit 二、效果图&#xff1a; 三、关键代码&#xff1a; <com.cong.myrighttolefttextdemo.MarqueeTextViewandroid:id&q…

数字化转型的路径与策略:基于TOGAF框架的企业案例分析与实践总结

洞察企业数字化转型的本质 随着全球技术的快速进步和市场的日益竞争&#xff0c;企业越来越意识到数字化转型不仅是一个技术趋势&#xff0c;更是业务模式、组织架构和运营效率的系统性变革。为应对这一挑战&#xff0c;企业需要从战略规划到实践落地全方位进行架构调整&#…

SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境)

SpringBoot教程&#xff08;安装篇&#xff09; | Docker Desktop的安装&#xff08;Windows下的Docker环境&#xff09; 前言如何安装Docker Desktop资源下载安装启动&#xff08;重点&#xff09;加入汉化包 设置加速镜像 前言 如果你在 Windows 上&#xff0c;确保 Docker …

Java数据结构--List介绍

前言&#xff1a; 数据结构可以说是一门思想&#xff0c;当我们在对数据处理、储存的时候需要用到。 前面我用C语言写过数据结构的相关内容&#xff0c;在Java阶段的数据结构思想是一样的&#xff0c;就是有些地方实现的方式是有区别的。 因此在Java阶段前期的数据结构&#xf…

腾讯云AI 驱动的数据库 TDSQL-C 操作与电商可视分析 ---实战体验历险记

腾讯云AI 驱动的数据库 TDSQL-C 操作与电商可视分析---实战体验历险记 一、背景介绍 二、实验介绍 三、效果展示 四、实操指导 4.1 系统设计 4.2 环境搭建 4.2.1 购买 TDSQL-C Mysql Serverless 实例 4.2.2 部署HAI高算力服务器 4.2.3 本地python环境搭建 4.3 应用构建 4.3…