2015-02-05 5 views
0

Я пытаюсь сделать снимок экрана, а затем просмотреть его для пикселя с определенным цветом. Во-первых, я попытался просто напечатать цвет изображения с определенной координатой xy, но я даже не мог этого сделать. Что я делаю не так?Как проверить пиксель bufferedimage для определенного цвета в Java

static int ScreenWidth; 
static int ScreenHeight; 
static Robot robot; 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    // TODO code application logic 
    callibrateScreenSize(); 
    findSquares(); 
    //takeScreenShot(); 

    try { 
     Thread.sleep(1000); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

public static void callibrateScreenSize() { 

    try { 
     Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); 
     ScreenWidth = captureSize.width; 
     ScreenHeight = captureSize.height; 
     System.out.println("Width is " + ScreenWidth); 
     System.out.println("Height is " + ScreenHeight); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    //return null; 
} 

public static BufferedImage takeScreenShot() { 
    Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); 
    BufferedImage image = robot.createScreenCapture(captureSize); 
    return image; 
} 

public static void findSquares() { 
    System.out.println(takeScreenShot().getRGB(5,5)); 
} 

Спасибо!

+0

Что случилось с вашим текущим кодом? – immibis

+0

Что вы получаете для вывода? –

+0

Для вывода я получил размеры изображения, а затем ошибку –

ответ

2

Вы можете использовать BufferedImage#getRGB или byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData(), чтобы получить данные о пикселях. getRBG более удобно, но, как правило, медленнее, чем получить массив пикселей

getRGB пакеты данных пикселя в int, getData возвращает RGB (A) в каждой записи массива (R = n; G = n+1; B=n+2(, A=n+3)), поэтому нужно будет обрабатывать это сами

вы можете использовать java.awt.Color, который позволяет получить доступ к значениям RGB цвета, то упаковать его в качестве значения int или преобразовать int к Color

Color color = new Color(bufferedImage.getRGB(0, 0), true); 
int redColor = Color.RED.getRGB(); 

Ответ на this question приведен пример работы с пиксельными данными byte[]

В принципе, вы должны цикла по данным, сравнивая значения в изображении к значению вы после, либо непосредственно (в сравнении красный , зеленые и синие значения) или косвенно, сравнивая упакованные значения int или Color.

Лично я бы захватить пиксельные данные, преобразовать каждый элемент в int и сравнить ее с ранее упаковывается int из Color объекта, это создает меньшее количество короткоживущих объектов и должно быть достаточно эффективными

Вы можете посмотреть на this answer, которые используют getRGB для получения красного, зеленого, синего значения из данного пикселя

+0

Ой хорошо, поэтому, если я хочу протестировать каждый пиксель на картинке, я могу настроить цикл и прокрутить все пиксели с помощью «Цветного» и тестового цвета? Теперь мой единственный вопрос: почему печать 'getRGB()' не работает? Также как я могу проверить определенный цвет? –

+0

'getRGB' возвращает' int' (упакованный пиксель), как я уже сказал, я бы начал с создания «Цвет» цвета, который вы хотите найти, и используйте 'Color # getRGB', чтобы вернуть упакованное значение' int' для это цвет. Затем он сравнивает результат со значениями из 'BufferedImage # getRGB' – MadProgrammer

+0

Почему я не могу запустить это в методе? 'Прямоугольник captureSize = новый прямоугольник (Toolkit.getDefaultToolkit(). GetScreenSize()); BufferedImage image = robot.createScreenCapture (captureSize); Цветной цвет = новый Цвет (изображение.getRGB (0, 0), true); ' –

0

Вот то, что я написал некоторое время назад с помощью класса робота. Он возвращает массив экрана везде, где экран белый, для моего приложения он был не очень дорогостоящим, но я обнаружил, что для каждого значения значения индивидуально используется робот. Сначала я даже не прочитал ваш вопрос, но, оглядываясь назад, я думаю, что это поможет вам ЛЮБИТЬ. Удачи. И затем я увидел исходную дату публикации ...

public boolean[][] raster() throws AWTException, IOException{ 
    boolean[][] filled= new boolean[720][480]; 
    BufferedImage image = new Robot().createScreenCapture(new Rectangle(0,0,720,480)); 
//accepts (xCoord,yCoord, width, height) of screen 
    for (int n =0; n<720; n++){ 
      for (int m=0; m<480; m++){ 
       if(new Color(image.getRGB(n, m)).getRed()<254){ 
//can check any rgb value, I just chose red in this case to check for white pixels  
        filled[n][m]=true; 
       } 
      } 
     } 
     return filled; 
} 
Смежные вопросы