热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Javarobot类的getPixelColor问题

前面想做一个JAVA图像识别的小程序,写完代码之后运行发现一直出不了结果,刚开始还以为是代码错了,检查了许久也不知道哪里错了。后来在检测循环的时候就发现,找图运行的相当缓慢,最后发

前面想做一个JAVA图像识别的小程序,写完代码之后运行发现一直出不了结果,刚开始还以为是代码错了,检查了许久也不知道哪里错了。后来在检测循环的时候就发现,找图运行的相当缓慢,最后发现是 robot.getPixelColor这个方法相当的耗费时间。

写了一段代码进行测试

public static void main(String[] args){try {Robot robot=new Robot();long nowTime=System.currentTimeMillis();BufferedImage bufferedImage=robot.createScreenCapture(new Rectangle(0, 0, 50, 50));for(int x=0;x System.out.println("使用了"+(nowTime2-nowTime)+"毫秒,平均获得一个像素消耗"+((nowTime2-nowTime)/(bufferedImage.getWidth()*bufferedImage.getHeight()))+"毫秒");} catch (AWTException e) {// TODO Auto-generated catch blocke.printStackTrace();
}}


这里只截图了一个50*50的极其小的图片,然后对其进行遍历获得像素点的RGB值。最后输出结果竟然是

使用了3362毫秒,平均获得一个像素消耗33毫秒

一个像素消耗了33毫秒!用这种速度找图,不还得找到猴年马月去啊!


后来我就思考为什么会这样,按理来说,获取一个像素的RGB值不应该消耗这么久的时间

我首先换了一个方法,即把robot.getPixelColor(x, y);换成bufferedImage.getRGB(x, y);

再次进行输出


此时代码为

public static void main(String[] args){try {Robot robot=new Robot();long nowTime=System.currentTimeMillis();BufferedImage bufferedImage=robot.createScreenCapture(new Rectangle(0, 0, 1920, 1024));for(int x=0;x


这个时候查找的范围是1920*1024比之前不知道大了多少倍

代码输出结果

使用了114毫秒,平均获得一个像素消耗0毫秒

这个结果才比较正常!

那么到底是为什么导致了这两个效果似乎相差不多的方法实际执行速度差了十万八千里呢?
我第一个想到的是是不是因为getPixelColor返回的是一个对象color 而getRgb返回的是一个基元类型int 是不是在这上面出了问题呢?

接下来代码进行试验,直接手动创建1000个color对象

代码如下

public static void main(String[] args){long nowTime&#61;System.currentTimeMillis();for(int i&#61;0;i<1000;i&#43;&#43;){new Color(0);}long nowTime2&#61;System.currentTimeMillis();System.out.println(nowTime2-nowTime);}


输出执行时间,仅仅79毫秒,可以看出,根本就不是这个问题&#xff01;

那么问题应该就在getPixelColor这个方法本身上面&#xff01;他到底是怎么实现获取像素点对应的color对象的呢&#xff1f;

我感觉他可能是在每次获取像素点的时候都重新进行了截图,最后进行测试,发现果然如此&#xff01;

其实想想也可以明白,getRGB操作的对象是一个不会变的内存中的图片。而getPixelColor却是获取当前屏幕上某坐标点的color对象&#xff01;那么他获取之前,就应该要获取一次整个屏幕的图像吧&#xff01;所以getPixelColor就变得很慢了&#xff01;

所以最好的做法还是自己手动把整个屏幕一次截图成bufferedImage,然后再调用getRgb()

----------

欢迎关注我的github https://github.com/luckyCatMiao



&#xfeff;&#xfeff;

推荐阅读
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 本文介绍 Java 中如何使用 Year 类的 atMonth 方法将年份和月份组合成 YearMonth 对象,并提供代码示例。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 本文详细介绍了Java的安装、配置、运行流程以及有效的学习方法,旨在帮助初学者快速上手Java编程。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • JavaScript 中创建对象的多种方法
    本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ... [详细]
  • Spring Boot单元测试中Redis连接失败的解决方案
    本文探讨了在Spring Boot项目中进行单元测试时遇到Redis连接问题的原因及解决方法,详细分析了配置文件加载路径不当导致的问题,并提供了有效的解决方案。 ... [详细]
  • 本文介绍了SVD(奇异值分解)和QR分解的基本原理及其在Python中的实现方法。通过具体代码示例,展示了如何使用这两种矩阵分解技术处理图像数据和计算特征值。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
author-avatar
子晴一-夏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有