Robot.getPixelColor против BufferedImage.getRGB - PullRequest
0 голосов
/ 03 мая 2018

Я спрашиваю это сегодня с целью сравнения двух.

Я пытаюсь создать бота, который может нажимать пробел в определенное время.

В любом случае, позвольте мне показать, что я пытаюсь сравнить.

    Robot robot = new Robot();

Это будет робот. (Java.awt.Robot;)

У меня такой вопрос, что быстрее для того, чтобы попытаться постоянно читать один (или более) пикселей на экране одновременно?

Мои текущие (выполняющиеся) программы, которые идентичны, за исключением одной, использующей

Robot.getPixelColor(int, int)

и другое использование

BufferedImage image Robot.createScreenCapture(Rectangle)
imaage.getRGB

Они запускаются много раз в секунду, и я просто пытаюсь выяснить, что более последовательно быстрее. Они оба кажутся случайными со скоростью, с которой они работают, поэтому любой совет приветствуется.

Если вы хотите, чтобы пример поместил их, вот его настройка.

Вот пример использования Robot.getPixelColor (int, int)

    Robot robot = new Robot();
    Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    Point prompt = new Point(913, 506, robot);
    BufferedImage screenImage = robot.createScreenCapture(rect);    
    for(int i = 0; i < 360; i++) {
        zones.add(new Point(radius * Math.cos(Math.toRadians(i)) + centerX, radius * Math.sin(Math.toRadians(i)) + centerY, robot));
    }
    System.out.println("Resolution: "  + width + " * " + height/* + " " + robot.getPixelColor(20, 20)/* + " " + screenImage.getRGB((int) prompt.getX(), (int) prompt.getY())*/);
    while(true) {
        tempZone = null;
        while(prompt.hasColor(promptColor)) {
            System.out.println("Found prompt, trying to find zone.");
            int count = 0;
            for(int i = 0; i < zones.size(); i++) {
                if(zones.get(i).hasColor(zoneColor)){
                    tempZone = zones.get(i);
                    break;
                }
            }
            if(tempZone != null) {
                System.out.println("Found zone at: " + tempZone.getX() + ", " + tempZone.getY() + ". Looking for ticker...");
                tempZone.whenHasColor(zoneColor);
            }else{
                System.out.println("Unable to find zone.");
            }
            while(prompt.hasColor(promptColor)) {}
        }
    }

с классом очков:

public class Point {    
    private double x;
    private double y;
    private final Robot robot;

    public Point(double x, double y, Robot rob) {
        this.x = x;
        this.y = y;
        this.robot = rob;
    }

    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }
    public boolean hasColor(Color color) {
        return (robot.getPixelColor((int )x, (int) y).equals(color));
    }
    public void whenHasColor(Color color) throws IOException {
        Rectangle rect = new Rectangle(889 + (int) x, 449 + (int) y, 1, 1);
        while(hasColor(color)) {
            //Nothing
        }
        BufferedImage cap = robot.createScreenCapture(rect);
        if(Math.abs(Math.abs(cap.getRGB(0, 0)) - 15657182) < 350000) {
            System.out.println("Missed Zone, failure.");
        }else {
            robot.keyPress(Main.promptKey);
            System.out.println("Found ticker pressing key. ");
        }
    }
}

Для тех, кто интересуется, откуда может появиться что-то конкретное, я использую модифицированную версию этого сайта в качестве средства для создания этого бота.

Теперь для примера с использованием Robot.createScreenCapture (Rectangle) и BufferedImage.getRGB (int, int)

    Robot robot = new Robot();
    Rectangle rect = new Rectangle(889, 449, 149, 149); 
    Point prompt = new Point(24, 57, robot);
    String format = "png";
    String fileName = "fullDebug1." + format;       
    BufferedImage screenImage = robot.createScreenCapture(rect);    
    for(int i = 0; i < 360; i++) {
        zones.add(new Point(radius * Math.cos(Math.toRadians(i)) + centerX, radius * Math.sin(Math.toRadians(i)) + centerY, robot));
    }
    System.out.println("Resolution: "  + width + " * " + height/* + " " + screenImage.getRGB((int) prompt.getX(), (int) prompt.getY())*/);
    while(true) {
        tempZone = null;
        int zoneFinal = 0;
        while(prompt.hasColor(promptColor)) {
            System.out.println("Found prompt, trying to find zone.");
            BufferedImage zoneImage = robot.createScreenCapture(rect);
            int count = 0;
            for(int i = 0; i < zones.size(); i++) {
                if(zones.get(i).hasColorZones(zoneColor, zoneImage)){
                    tempZone = zones.get(i);
                    break;
                }
            }
            if(tempZone != null) {
                System.out.println("Found zone at: " + tempZone.getX() + ", " + tempZone.getY() + ". Looking for ticker...");
                tempZone.whenHasColor(zoneColor);
            }else{
                System.out.println("Unable to find zone.");
            }
            while(prompt.hasColor(promptColor)) {}
        }

и его класс Point:

public class Point {    
    private double x;
    private double y;
    private final Robot robot;

    public Point(double x, double y, Robot rob) {
        this.x = x;
        this.y = y;
        this.robot = rob;
    }

    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }
    public boolean hasColor(int color) {
        Rectangle rect = new Rectangle(889, 449, 149, 149);
        BufferedImage screenImage = robot.createScreenCapture(rect);
        return (Math.abs(screenImage.getRGB((int) x, (int) y)) == Math.abs(color))
    }
    public boolean hasColorPixel(int color, Rectangle rect) throws IOException {
        BufferedImage cap = robot.createScreenCapture(rect);
        return Math.abs(cap.getRGB(0, 0)) == Math.abs(color);
    }

    public boolean hasColorZones(int color, BufferedImage screenImage) {
        return Math.abs(screenImage.getRGB((int) x, (int) y)) == Math.abs(color);
    }

    public boolean hasColorList(int[] colors, BufferedImage screenImage) {
        for(int i : colors) {
            if(Math.abs(screenImage.getRGB((int) x, (int) y)) == Math.abs(i)) {
                return true;
            }
        }
        return false;
    }

    public void whenHasColor(int color) throws IOException {
        Rectangle rect = new Rectangle(889 + (int) x, 449 + (int) y, 1, 1);
        while(hasColorPixel(color, rect)) {
            //Nothing
        }
        BufferedImage cap = robot.createScreenCapture(rect);
        if(Math.abs(Math.abs(cap.getRGB(0, 0)) - 15657182) < 350000) {
            System.out.println("Missed Zone, failure.");
        }else {
            robot.keyPress(Main.promptKey);
            System.out.println("Found ticker pressing key. ");
        }
    }
}

Итак, мой вопрос, который будет работать быстрее? Иногда последний вариант (который я более тщательно отлаживал) получает по 10 подряд, но затем тоже случайно выходит из строя. Сначала я подумал, что мой ноутбук не может с этим справиться, но после запуска на моем рабочем столе я получил те же результаты. Я бы предпочел, чтобы бот не работал должным образом или нет.

Я надеюсь, что смог дать достаточно информации, чтобы кто-нибудь смог мне помочь. Если есть что-то, что мне нужно добавить или изменить, пожалуйста, скажите мне! Это мой первый вопрос, и я хотел бы научиться быть лучше на этом сайте. Еще одно извинение, если 1) пиксели не совпадают на вашем экране, поэтому вы не сможете запустить это, чтобы смоделировать мою ситуацию, и 2) если этот пост был длинным. Я хотел сделать хороший «Минимальный, полный и проверяемый пример», но я не был уверен, как его сократить.

EDIT

Чтобы сделать код более актуальным, как указал Бен, я мог бы его сократить. Но я подумал о чем-то, что делает его более полезным.

Что можно сделать с этим кодом, чтобы оптимизировать его работу быстрее, чтобы бот работал на 100% последовательно или, по крайней мере, ближе к 100%, чем сейчас (~ 60%)

...