【问题标题】:respond to color events with java用java响应颜色事件
【发布时间】:2012-02-22 21:04:54
【问题描述】:

我正在构建一个 java 应用程序来解决难题。我编写它的方式基本上程序将截取屏幕截图,在屏幕截图中找到一个像素,然后通过机器人功能将鼠标移动到桌面上的那个位置。我了解拍摄屏幕截图、将其存储在数组中、探索数组直到弹出具有正确颜色组合的存储像素并将鼠标移动到屏幕上的该位置的理论,但是我终生无法获得码下来。如果有人知道,或者可以拼凑一个截屏的示例代码,将其存储在一个数组中(或者存储设备我不知道数组是否最适合这种特定用途)从该数组中找到一个像素移动鼠标到像素位置然后清除数组,我会非常满意,因为这让我发疯!

到目前为止我有:

public static void main(String[] args) 抛出异常{

Robot robot = new Robot();

{
private static Rectangle rectangle = new Rectangle(0, 0, 1075, 700);

{
    BufferedImage image = r.createScreenCapture(rectangle);
    search: for(int x = 0; x < rectangle.getWidth(); x++)
    {
        for(int y = 0; y < rectangle.getHeight(); y++)
        {
            if(image.getRGB(x, y) == Color.getRGB(195, 174, 196))
            {
                Robot.mouseMove(x, y);
                break search;
            }
        }
    }
}

}

我收到三个错误:

  1. 表达式开头非法,指针指向下面的get in代码段

    私有静态矩形矩形 = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

  2. 表达式开头非法,下面代码段中指向Size的指标

    私有静态矩形矩形 = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

  3. ;预期指标指向 Rectangle 矩形

    私有静态矩形矩形 = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

【问题讨论】:

  • “拼凑一个示例代码” 所以不是代码工厂。为什么不通过向我们发布您的最佳尝试(在此之前)向我们展示一些努力?
  • Zoom 可能是构建sscce 的起点。
  • @user1179522 您是否尝试编译您的代码?

标签: java awt screenshot awtrobot getpixel


【解决方案1】:

创建屏幕截图并循环播放虽然并不难。 GraphicsDevice 的 Javadoc 将告诉您如何获得正确的屏幕尺寸。

我认为你唯一不能做的就是响应“颜色事件”​​。不过,您可以轮询屏幕以查看颜色何时发生变化。

import java.awt.Color;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;

public class FindColor
{
    private static Rectangle rectangle = new Rectangle(800, 600);

    public static void main(String[] args) throws Exception
    {
        Robot r = new Robot();
        BufferedImage image = r.createScreenCapture(rectangle);
        search: for(int x = 0; x < rectangle.getWidth(); x++)
        {
            for(int y = 0; y < rectangle.getHeight(); y++)
            {
                if(image.getRGB(x, y) == Color.BLACK.getRGB())
                {
                    r.mouseMove(x, y);
                    System.out.println("Found!");
                    break search;
                }
            }
        }
    }
}

-编辑,因为问题已扩展- 如果您要在那里检查它,则不需要将图像写入磁盘。 BufferedImage 已经有了访问单个像素的方法,所以我认为不需要将像素数据转换为数组。

【讨论】:

  • 但是对于图像捕获,您可以搜索特定的颜色,如果我想让鼠标点击它找到的第一个亮蓝色像素,我可以使用上面的代码吗?通过响应颜色变化,我的意思是我会让它继续拍摄指定的像素,当该像素不再 = 预设颜色时,如果你明白我的意思,我会再次点击鼠标。
  • 是的,您可以搜索任何颜色。您只需要修改“image.getRGB(x, y) == Color.BLACK.getRGB()”这一行(我只是在寻找黑色)对于颜色变化,您可以同时检查过去的值发现或做复杂的图像差异(取决于所需的复杂性)
  • 你说得这么简单,让我看看我能把它搞得多么糟糕,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2023-03-22
  • 2012-12-07
相关资源
最近更新 更多