Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как ускорить работу клас Robot,его метода getPixеl 
:(
    Опции темы
andruxai
Дата 24.12.2013, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 24.12.2013

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
LSD
Дата 24.12.2013, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
andruxai
Дата 24.12.2013, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 24.12.2013

Репутация: нет
Всего: нет



Всех пикселей. Там их 350 000 
PM MAIL   Вверх
LSD
Дата 24.12.2013, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
andruxai
Дата 24.12.2013, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 24.12.2013

Репутация: нет
Всего: нет



Вот код мой программы с 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.: Если есть нелепые ошибки прошу меня извинить, я начинаюший программист.
PM MAIL   Вверх
andruxai
Дата 25.12.2013, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 24.12.2013

Репутация: нет
Всего: нет



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

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

PM MAIL   Вверх
andruxai
Дата 25.12.2013, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 24.12.2013

Репутация: нет
Всего: нет



Сделал заново 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();
        }
    }

PM MAIL   Вверх
LSD
Дата 25.12.2013, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0545 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.