Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как ускорить работу клас Robot,его метода getPixеl


Автор: andruxai 24.12.2013, 13:05
Всем привет.  Мне нужно знать цвет пикселей изображения монитора (размер изображения 700х500 пикселей) и если есть мне нужный цвет пикселя то он выдает мне его координаты. Я использую клас Robot, и его метод getPixelColor(х, у), но он очеьм медленный, делает проверку изображения за 20 секунд (примрно). А мне нужно чтоб проверка осуществялась раза 4 за секунду, ведь изображение постоянно меняеться.
Может ктото знает как ускорить можна этот процес???
Можна ли разбить условно это изоброжение на части и выполнить проверку одновременно во всех частях?

Автор: LSD 24.12.2013, 17:05
Цитата(andruxai @  24.12.2013,  14:05 Найти цитируемый пост)
делает проверку изображения за 20 секунд (примрно)

Проверку одного пиксела или все пикселы 700х500?

Автор: andruxai 24.12.2013, 17:49
Всех пикселей. Там их 350 000 

Автор: LSD 24.12.2013, 18:54
Если захватывать все пиксели разом createScreenCapture(), то у меня на машине это занимает 15-50 миллисекунд. 20 секунд это реально слишком. Тут какая-то проблема в системе.

Автор: andruxai 24.12.2013, 19:05
Вот код мой программы с getPixelColor(х, у)
Код

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Container;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
 class myFrame extends JFrame {
        private Robot robot;
     
        public myFrame() {
            setTitle("Test");
            JPanel panel = new JPanel();
     
            try {
                robot = new Robot();
            } catch (AWTException ex) {
            }
            JButton bt1 = new JButton("Start");
            panel.add(bt1);
            bt1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
     
                    System.out.println("Start");
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            System.out.println("Start in thread");
                            
                            robot.mouseMove(50,100);
                            robot.delay(200);
                            for (int i =50; i <= 350; i++) {
                                for (int j = 270; j <= 400; j++) {
                                 robot.mouseMove(i, j);
                                    Color c1 = robot.getPixelColor(i, j);
                                    Color col = new Color(121, 133, 145);
                            
                                    System.out.print("Color print: Red="+c1.getRed()+" Green="+c1.getGreen()+" Blue="+c1.getBlue());
                                    System.out.print(" "+i + " " + j);
                                    System.out.println();
                                    if (c1.equals(col)) {
                                        System.out.print(i + " " + j + "Yes ");
                                        robot.mouseMove(i, j);
                                        robot.delay(500);
                                    } else {
                                        System.out.print("No found ");
                                    }
                                }
                            }
                            System.out.println("End cykle");
                           robot.mouseMove(500, 600);
                        }
                    }).start();
                }
            });
            Container pane = getContentPane();
            pane.add(panel);
            pack();
        }
    }
     
    public class Test {
        public static void main(String[] args) {
            myFrame frame = new myFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.show();
        }
    }


метод createScreenCapture(). чтото не получаеться

Код

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Container;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;

 
 class myFrame extends JFrame {
        private Robot robot;
     
        public myFrame() {
            setTitle("Test");
            JPanel panel = new JPanel();
     
            try {
                robot = new Robot();
            } catch (AWTException ex) {
            }
            JButton bt1 = new JButton("Start");
            panel.add(bt1);
            bt1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
     
                    System.out.println("Start");
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            System.out.println("Start in thread");
                            Rectangle rec = new Rectangle(100, 100, 999, 710);
                            BufferedImage img=robot.createScreenCapture(rec);  
                            robot.mouseMove(50,100);
                            robot.delay(200);
                            for (int i =50; i <= 350; i++) {
                                for (int j = 270; j <= 400; j++) {
                                 robot.mouseMove(i, j);
                                    Color c1 = new Color(img.getRGB(i, j));
                                    Color col = new Color(121, 133, 145);
                              
                                    System.out.print("Color print: Red="+c1.getRed()+" Green="+c1.getGreen()+" Blue="+c1.getBlue());
                                    System.out.print(" "+i + " " + j);
                                    System.out.println();
                                    if (c1.equals(col)) {
                                        System.out.print(i + " " + j + "Yes ");
                                        robot.mouseMove(i, j);
                                        robot.delay(500);
                                    } else {
                                        System.out.print("No found ");
                                    }
                                }
                            }
                            System.out.println("End cykle");
                           robot.mouseMove(500, 600);
                        }
                    }).start();
                }
            });
            Container pane = getContentPane();
            pane.add(panel);
            pack();
        }
    }
     
    public class Test {
        public static void main(String[] args) {
            myFrame frame = new myFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.show();
        }
    }


P.S.: Если есть нелепые ошибки прошу меня извинить, я начинаюший программист.

Автор: andruxai 25.12.2013, 01:14
С поиском цвета уже разобрался. Появилаь другая проблема, как только программа находит нужный цвет она дольжна кликнуть раз мышкой по этому пикселю, а она все время кликает туда. В чем может бить ошибка?
Код программы:
Код

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Container;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.image.BufferedImage;
 
 class myFrame extends JFrame {
        private Robot robot;
     
        public myFrame() {
            setTitle("Test");
            JPanel panel = new JPanel();
     
            try {
                robot = new Robot();
            } catch (AWTException ex) {
            }
            JButton bt1 = new JButton("Start");
            panel.add(bt1);
            bt1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
     
                    System.out.println("Start");
                    new Thread(new Runnable() {
                   
                        @Override
                        public void run() {
                            System.out.println("Start in thread");
                            
                        Rectangle rec = new Rectangle(0, 0, 1023, 767);
                        BufferedImage img=robot.createScreenCapture(rec); 
                           for (int i =50; i <= 950; i++) {
                               for (int j = 150; j <= 566; j++) {
                                    Color c1 = new Color(img.getRGB(i, j));
                                    Color col=new Color(245,253,250);
                                  if (c1.getBlue()<180&c1.getRed()>(col.getRed())) {
                                        robot.mouseMove(i, j);
                                        robot.mousePress(InputEvent.BUTTON1_MASK);
                                        robot.mouseRelease(InputEvent.BUTTON1_MASK);
                                        robot.delay(2500);
                                   
                                   }
                                }
                            }
                            System.out.println("End cykle");
                           
                        }
                    }).start();
                }
            });
            Container pane = getContentPane();
            pane.add(panel);
            pack();
        }
    }
     
    public class Test {
        public static void main(String[] args) {
            myFrame frame = new myFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.show();
        }
    }

Автор: andruxai 25.12.2013, 11:48
Сделал заново createScreenCapture после каждого выполненого условия. Я хотел сделать так чтоб программа постоянно сканировала монитор и если находила то что нада, автоматически кликала по нём, добал вечный цыкл но программа работает только до тех пор пока я не нажму на мышку, как только кликнул мышью программу выбрасывает в самый конец и она только выводит "End cykle". А так находит правильно все пиксели .
Код программы:
Код

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Container;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.image.BufferedImage;
 
 class myFrame extends JFrame {
        private Robot robot;
     
        public myFrame() {
            setTitle("Test");
            JPanel panel = new JPanel();
     
            try {
                robot = new Robot();
            } catch (AWTException ex) {
            }
            JButton bt1 = new JButton("Start");
            panel.add(bt1);
            bt1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
     
                    System.out.println("Start");
                    new Thread(new Runnable() {
                   
                        @Override
                        public void run() {
                            System.out.println("Start in thread");
                            
                        Rectangle rec = new Rectangle(0, 0, 1023, 767);
                        BufferedImage img=robot.createScreenCapture(rec); 
                                for(;;){
                          l1: for (int i =50; i <= 950; i++) {
                               for (int j = 150; j <= 566; j++) {
                                    Color c1 = new Color(img.getRGB(i, j));
                                    Color col=new Color(245,253,250);
                                  if (c1.getBlue()<180&c1.getRed()>(col.getRed())) {
                                        robot.mouseMove(i, j);
                                        robot.mousePress(InputEvent.BUTTON1_MASK);
                                        robot.mouseRelease(InputEvent.BUTTON1_MASK);
                                        robot.delay(2500);
                                                img=robot.createScreenCapture(rec);
                                        break l1;
                                   
                                   }
                                }
                            }
                            System.out.println("End cykle");
                           
                        }}
                    }).start();
                }
            });
            Container pane = getContentPane();
            pane.add(panel);
            pack();
        }
    }
     
    public class Test {
        public static void main(String[] args) {
            myFrame frame = new myFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.show();
        }
    }

Автор: LSD 25.12.2013, 18:33
1. Цикл пишется как cycle
2. Фраза End cycle пишется после окончания обработки одного скриншота, и переходя к следующему. И она вполне успешно продолжает работу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)