Robot Class [Como comparar uma imagem com a tela]

Bom dia mestres!

Gostaria de fazer um bot para comparar uma imagem (25x25 quase do tamanho de um icon) com uma aplicacao em 1280x720, explicando melhor…

quero que minha aplicacao java rode toda aquela janela em especifico a procura do pixel igual a imagem 25x25, serei mais especifico ainda kk :

Tenho uma imagem repleta de arvores 1280x720 e tenho uma imagem 25x25 de uma laranja, entao meu bot vai percorrer toda a imagem das arvores procurando pela laranja que encaixa exatamente nos pixels que eu dei pra aplicacao.

me disseram pra usar robot class mas nao consigo achar um video explicando como fazer isso, alguem indica algo melhor pra eu estar estudando ou ate mesmo um video que ensine isso?

Obs* de preferencia que a aplicacao nao percorra todo o monitor e sim apenas a aplicacao que eu setar, assim reduz tempo.

Ja fico grato desde ja!

Você vai usar o Robot somente para tirar o “print screen” da tela.
O restante são algoritmos de processamento de imagens.

1 curtida

nao irei usar o robot pra apertar as teclas e tals? acabei de perceber que nao especifiquei isso no topico mil perdoes kkk

mas se o pixel da tela for igual ao pixel 25x25 a aplicacao vai apertar W .

enfim… poderia citar alguma biblioteca ou nomes específicos desses algoritmos pra que eu possa ta estudando?

public class LostArkOnline extends Thread {

public Rectangle rect;

public LostArkOnline(int x, int y, int width, int height) {
    rect = new Rectangle(x, y, width, height);
}

public void run() {
    try {
        Robot robot = new Robot();

        robot.delay(1500);
        //BufferedImage image = robot.createScreenCapture(rect);
        //ImageIO.write(image, "png", new File("./image/screen.png")); 

        while (true) {
            BufferedImage img = robot.createScreenCapture(rect);//tira print da tela
            WritableRaster r = img.getRaster();
            DataBuffer db = r.getDataBuffer();
            DataBufferInt dbi = (DataBufferInt) db;
            int[] data = dbi.getData();

            for (int x_scale = 0; x_scale < rect.width; x_scale += 30) { //Roda toda a tela aumentando a escala.
                for (int y_scale = 0; y_scale < rect.height; y_scale += 30) {
                    int rgb = data[x_scale + rect.width * y_scale];

                    if (rgb == -806825 || 
                            rgb == -1200035 || 
                            rgb == -1924268 ||
                            rgb == -81302 ||
                            rgb == -2914754 ||
                            rgb == -1065885 ||
                            rgb == -8362958 ||
                            rgb == -1193865) { // se a cor do pixel for igual as listadas, faça:
                        //robot.mouseMove(rect.x + x_scale, rect.y + y_scale);
                        robot.keyPress(KeyEvent.VK_X); //Aperta X
                        robot.keyRelease(KeyEvent.VK_X);
                        
                        JOptionPane.showMessageDialog(null, "Pixel Encontrado", "-----", JOptionPane.INFORMATION_MESSAGE); //Exibe a mensagem
                    }
                }
            }
        }

    } catch (AWTException e) {
        e.printStackTrace();
    }
}



public static void main(String[] args) {
    new LostArkOnline(0, 0, 1920, 1080).start();
}

}

Estou desenvolvendo esse codigo para um jogo a fim de treinar algumas habilidades usando algo que gosto para incentivo(o jogo) mas dentro do jogo ele nao esta apertando a tecla X, fora do jogo na aplicacao ele aperta, o que pode ser?