【问题标题】:How would I go about "monitoring" the center of the screen?我将如何去“监控”屏幕的中心?
【发布时间】:2015-07-29 13:28:51
【问题描述】:

在 Java 中,我想基本上关注屏幕死点的 1 个像素,并在颜色发生变化时检测/调用动作(例如,中心聚焦在白色背景上,突然我打开了绿色背景,1 个像素被检测为从白色 -> 绿色)。我知道我需要分辨率的高度和宽度并从中确定中心。

现在唯一的问题是我不知道我需要什么代码来进一步推进这个过程。有人可以指导我完成我能做什么吗?我知道这有点宽泛,因为它不包含任何代码。

【问题讨论】:

  • 您要精确监控的像素在哪里?在摇摆/awt 容器中? PC桌面背景?在网络浏览器窗口中?安卓应用?
  • 如果你明白我的意思,我基本上希望它监控计算机中心像素,这就是为什么我不确定我需要什么代码。
  • 我自己从未尝试过,但猜测您可以通过GraphicsEnvironment / GraphicsDevice 获得它。
  • @LanceJava 谢谢这在获得中心方面是有道理的,我会试试看。但是我也从未使用过点,知道如何找到点的颜色或检测变化吗?

标签: java pixel resolution


【解决方案1】:

这是一个快速而肮脏的例子,也许它会有所帮助:

public class PixelBot {

private final Robot bot;

private boolean running = true;

private int lastPixelValue = 0;

public static void main(String[] args) throws Exception {
    new PixelBot();
}

public PixelBot() throws AWTException {
    this.bot = new Robot();
    this.runInBackground();
}

private void checkPixel() {
    Rectangle areaOfInterest = getAreaOfInterest();
    BufferedImage image = bot.createScreenCapture(areaOfInterest);

    int clr = image.getRGB(0, 0);
    if (clr != lastPixelValue) {
        int red = (clr & 0x00ff0000) >> 16;
        int green = (clr & 0x0000ff00) >> 8;
        int blue = clr & 0x000000ff;
        System.out.println("\nPixel color changed to: Red: " + red + ", Green: " + green + ", Blue: " + blue);
        Toolkit.getDefaultToolkit().beep();
        lastPixelValue = clr;
    } else {
        System.out.print(".");
    }
}

private Rectangle getAreaOfInterest() {
    // screen size may change:
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    // half of screen, minus 1 pixel to be captured:
    int centerPointX = (int) (screenSize.getWidth() / 2 - 1);
    int centerPointY = (int) (screenSize.getHeight() / 2 - 1);
    Point centerOfScreenMinusOnePixel = new Point(centerPointX, centerPointY);
    return new Rectangle(centerOfScreenMinusOnePixel, new Dimension(1, 1));
}

private void runInBackground() {
    new Thread(new Runnable() {

        @Override
        public void run() {
            while (running) {
                checkPixel();
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}

public void stop() {
    this.running = false;
}
}

【讨论】:

  • 这实际上非常适合我的概念。如果除了打印“像素颜色已更改......”之外,我还想切换其他操作,我只需修改 checkPixel() 是否正确?我一定要阅读机器人,但非常感谢!
  • 是的。或者添加一个 PropertyChangeSupport 作为类的一个字段,并在更改时调用 firePropertyChanged()。
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多