Помогите с проблемкой !!!

Модератор: Absurd

Ответить
andruxa
Сообщения: 7
Зарегистрирован: 10 дек 2013, 16:36

24 дек 2013, 13:51

Всем привет. Мне нужно знать цвет пикселей изображения монитора (размер изображения 700х500 пикселей) и если есть мне нужный цвет пикселя то он выдает мне его координаты. Я использую клас Robot, и его метод getPixelColor(х, у), но он очеьм медленный, делает проверку изображения за 20 секунд (примрно). А мне нужно чтоб проверка осуществялась раза 4 за секунду, ведь изображение постоянно меняеться.
Может ктото знает как ускорить можна этот процес???
Можна ли разбить условно это изоброжение на части и выполнить проверку одновременно во всех частях?
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

24 дек 2013, 15:53

Специально для множественных запросов к экранным пикселям создана функция из того же класса: createScreenCapture
It's a long way to the top if you wanna rock'n'roll
andruxa
Сообщения: 7
Зарегистрирован: 10 дек 2013, 16:36

24 дек 2013, 18:05

somewhere писал(а):Специально для множественных запросов к экранным пикселям создана функция из того же класса: createScreenCapture

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

Код: Выделить всё

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();
	    }
	}
andruxa
Сообщения: 7
Зарегистрирован: 10 дек 2013, 16:36

25 дек 2013, 02:18

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

Код: Выделить всё

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();
	    }
	}
andruxa
Сообщения: 7
Зарегистрирован: 10 дек 2013, 16:36

25 дек 2013, 12:14

Сделал заново 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();
	    }
	}
andruxa
Сообщения: 7
Зарегистрирован: 10 дек 2013, 16:36

25 дек 2013, 12:15

somewhere писал(а):Специально для множественных запросов к экранным пикселям создана функция из того же класса: createScreenCapture
Сделал заново 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();
	    }
	}
Ответить