Search code examples
javapixelresolution

How would I go about "monitoring" the center of the screen?


In Java I want to essentially focus on the 1 pixel at the dead center of the screen and detect/call an action if there is a change of color (ex. Center is focused on a white background, and suddenly I open up a green background, that 1 pixel was detected as going from white -> green). I know I would need the height and width of the resolution and determine the center from that.

The only problem now is I have no idea what code I would need to further move on with this process. Can someone guide me through what I can do? I know this is kinda broad since it doesn't include any code.


Solution

  • Here is a quick and dirty example, maybe it helps:

    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;
    }
    }