我正在使用机器人截取屏幕截图,然后在这些屏幕截图中搜索较小的图像.由于伽马校正,这适用于Windows但不适用于OS X. 我能想出的最佳解决方案是简单地匹配相似的颜色而不是精确的颜色匹配.
我担心匹配相似的颜色将意味着超越getRGB因此会减慢我的程序(因为它采用多个屏幕截图并将它们与较小的图像进行比较以非常快速地搜索匹配).
我的问题是,假设我有BufferedImage截图和BufferedImage smallImage,我将如何判断Screenshot.getRGB(1,1)和smallImage.getRGB(1,1)是否是相似的颜色?
我正在使用Arduino Uno通过USB或蓝牙将(真正的)SNES控制器连接到计算机.
Arduino使用snespad库捕获控制器的按钮按下和释放.它将按钮按下和释放作为字符进行通信(例如,用于按A的'a',用于释放'A'的'A').接下来,Java程序使用rxtx库监听串行输出.最后,Java机器人使用keyPress和keyRelease模拟按键.
不幸的是,这种方法有一些缺点.主要问题是关键映射.我有点随意决定哪些键盘是键盘键.
Java似乎没有任何游戏手柄KeyEvents.当我说"游戏键盘KeyEvent"时,我指的是类似于Android SDK的东西:http://developer.android.com/reference/android/view/KeyEvent.html(ctrl + f"游戏手柄"或"按钮" .)
我的问题是,有没有办法模拟游戏手柄按钮按下而不是使用Java的机器人类按键?
我有一个程序,其唯一目的是在无限循环中驱动 ajava.awt.Robot
直到满足退出条件。
机器人快速连续执行多个动作,这需要它们之间有标准的 UI 延迟。为此,我使用java.awt.Robot.setAutoDelay(int ms)
,它似乎正是为此目的而设计的。
然而,在其他时候,我需要插入任意长的延迟才能完成操作。java.awt.Robot.delay(int ms)
我似乎可以在使用或 之间进行选择java.lang.Thread.sleep(long ms)
,并且很好奇它们之间的区别是什么,以及我应该使用哪个。
我的直觉是将所有操作保持在同一个“位置”,并使用java.awt.Robot.delay(int ms)
. 然而,思考片刻后,我假设这java.awt.Robot.delay(int ms)
将在机器人的操作堆栈上完成一个操作,如果这些是我在无限循环中唯一的延迟,我可能会非常快地、不必要地生成一个大得荒谬的结果。机器人的事件队列。
那时,我检查了APIjava.awt.Robot.delay(int ms)
,它告诉我以下内容:
休眠指定的时间。要捕获
InterruptedException
发生的任何 s,Thread.sleep()
可以改为使用。
由于未能对此事获得任何有用的见解,我决定向你们询问。
我已经使用 utils 完成了播放器部分,例如java.awt.Robot()
模拟基本的人类鼠标/键盘输出命令,读取 XML 文件。
我被困在必须记录该 XML 文件的部分。我不知道我可以使用哪个类来做与 Robot() 相反的事情如果你有任何女性机器人() 给我我会很高兴 :D
到目前为止,我在这个方向上唯一的事情是:
while (true) {
Point pos = MouseInfo.getPointerInfo().getLocation();
System.out.println(pos.x+" x "+pos.y);
}
Run Code Online (Sandbox Code Playgroud)
这并不多,也不是我真正想要的^_^,我不知道如何使用鼠标/键侦听器,因为它需要一个组件。如果这是唯一的方法,我应该使用什么组件,因为我不想要任何图形化的 Java 实现?无论如何我应该创建一个虚假的组件吗?哪一个?
例如,我希望我的录音机在 XML 中写入我如何单击 ubuntu 桌面或在 Firefox 上按 Enter 键。
我想这很清楚,如果不是,我会经常检查答案。祝您有美好的一天,感谢您阅读本文。
我想使用 Java 中的 Robot 类进行拖放。由于某种原因,下面的代码不起作用。这种方法有替代方法吗?
public static void main (String args []){
Robot robot = new Robot ();
robot.mouseMove(350, 226);
robot.keyPress(InputEvent.BUTTON1_MASK);
robot.mouseMove(250, 350);
robot.keyRelease(InputEvent.BUTTON1_MASK);
Run Code Online (Sandbox Code Playgroud)
}
我有一段代码,它的作用是找到图像(或屏幕的一部分)的颜色,如果 RG 和 B 颜色大于 127,则将 1 放在 2D int 数组的相应位置。这是我现在拥有的部分,但显然非常慢。有一个更好的方法吗?
private void traceImage(){
try{
Robot r = new Robot();
b = new int[470][338];
for(int y = 597; y < 597+469; y++)
{
for(int x = 570; x < 570+337; x++)
{
if(r.getPixelColor(x,y).getRed() > 127 &&
r.getPixelColor(x,y).getGreen() > 127 &&
r.getPixelColor(x,y).getBlue() > 127)
{
b[y-597][x-570] = 1;
}
else
{
b[y-597][x-570] = 0;
}
}
}
}
catch(Exception ex){System.out.println(ex.toString());}
}
Run Code Online (Sandbox Code Playgroud)
必须有一种更快的方法来使用上面的值来做到这一点。b
是 int 数组,它在此段中初始化。r
是一个机器人,我用它来查找屏幕上像素的颜色。x
并且y …
我(ab)使用Java的Robot
类在浏览器窗口中自动执行某些单击任务.在第一次单击时,Java应用程序失去焦点.如果机器人开始行为不端,我想终止程序.但是,我不能轻易这样做,因为机器人可以控制我的鼠标.
我想做的是让我的程序听取我发出的某种信号告诉它退出.例如,当按下"escape"键时,程序可以退出.但是,当应用程序不在焦点时,我不知道如何监听击键.
我在OSX 10.9中运行Java SE 6.
在这种情况下,我怎么能终止我的程序?
编辑:发布此内容后,我发现了一个解决同一问题的相关问题:在Java中收听没有焦点的输入.(但是,这并不完全重复,因为我的问题有点广泛.)
我正在Windows 8.1 64bit上开发一个JavaFX应用程序,带有4GB RAM,JDK版本为8u45 64bit.
我想捕获部分屏幕使用,Robot
但问题是我无法获取我想要捕获的锚窗格的屏幕坐标,我不想使用,snapshot
因为输出质量很差.这是我的代码.
我在这个链接中看到了这个问题在 JavaFX中获取Node的全局坐标, 并且这个 在javaFX中获得了一个节点的真实位置, 我尝试了每个答案,但没有任何工作,图像显示了屏幕的不同部分.
private void capturePane() {
try {
Bounds bounds = pane.getLayoutBounds();
Point2D coordinates = pane.localToScene(bounds.getMinX(), bounds.getMinY());
int X = (int) coordinates.getX();
int Y = (int) coordinates.getY();
int width = (int) pane.getWidth();
int height = (int) pane.getHeight();
Rectangle screenRect = new Rectangle(X, Y, width, height);
BufferedImage capture = new Robot().createScreenCapture(screenRect);
ImageIO.write(capture, "png", new File("image.png"));
} catch (IOException | AWTException ex) {
ex.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) public class R0b0t
{
public static void main(String[] args) throws Exception
{
Robot robot;
robot = new Robot();
robot.mouseMove(50,50);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是一个简单的程序,它将鼠标移动到我屏幕上的坐标(50,50).我在PC上执行程序时工作正常.
但是当我在Windows平板电脑上运行可执行jar文件时,坐标移动到(40,40).我正在用"光标位置"软件检查坐标.我尝试了不同的mouseMove
坐标,但鼠标仍然移动到平板电脑上的其他位置.
我该如何解决这个问题?我相信这与我平板电脑上的屏幕分辨率有关,因为我还尝试使用另一种软件来检测鼠标指向的颜色,并且颜色检测与我指向的颜色并不完全匹配.
我尝试在 Windows 7 上使用以下代码捕获屏幕
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = new Robot().createScreenCapture(screenRect);
ImageIO.write(capture, "jpg", new File("C:/capture/ScreenShot.jpg"));
Run Code Online (Sandbox Code Playgroud)
这段代码返回黑色图像,不知道为什么请帮忙。
进口情况如下:
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
Run Code Online (Sandbox Code Playgroud)
先感谢您。