Foro de elhacker.net

Programación => Java => Mensaje iniciado por: TriBlack en 14 Agosto 2013, 22:47 pm



Título: Java Colores
Publicado por: TriBlack en 14 Agosto 2013, 22:47 pm
Buenas... me gustaria saber si existe algun metodo en java para tomar el color de algo al dar un click me explico xD que por ejemplo de click en el boton de "Inicio" en el Windows y me de su color en hexadecimal o decimal... Gracias de antemano :)


Título: Re: Java Colores
Publicado por: 1mpuls0 en 14 Agosto 2013, 23:27 pm
Código
  1. try {
  2.            Robot robot = new Robot();
  3.  
  4.            Color color = robot.getPixelColor(500, 500);
  5.  
  6.            System.out.println("Red   = " + color.getRed());
  7.            System.out.println("Green = " + color.getGreen());
  8.            System.out.println("Blue  = " + color.getBlue());
  9.  
  10.        } catch (AWTException e) {
  11.            e.printStackTrace();
  12.        }
  13.  

Con mouseClicked obtienes las coordenadas donde se hizo clic.

Saludos.


Título: Re: Java Colores
Publicado por: TriBlack en 15 Agosto 2013, 00:13 am
Código
  1. try {
  2.            Robot robot = new Robot();
  3.  
  4.            Color color = robot.getPixelColor(500, 500);
  5.  
  6.            System.out.println("Red   = " + color.getRed());
  7.            System.out.println("Green = " + color.getGreen());
  8.            System.out.println("Blue  = " + color.getBlue());
  9.  
  10.        } catch (AWTException e) {
  11.            e.printStackTrace();
  12.        }
  13.  

Con mouseClicked obtienes las coordenadas donde se hizo clic.

Saludos.

Muchas gracias amigo :) ... me gustaria hacer otra pregunta y disculpa tantas molestas... Se puede hacer que java detecte en tiempo real los colores y con la clase Robot mueva al mouse a dicho color ? Me explicare mejor xD por ejemplo que de click en todo el color rojo que se consiga en la pantalla pero de manera automatica algo parecido a un bot nose si me entiendes  :-\


Título: Re: Java Colores
Publicado por: 1mpuls0 en 15 Agosto 2013, 05:58 am
Algo así podría servirte.

Código
  1. package Intermediate;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Robot;
  5. import java.awt.AWTException;
  6. import java.awt.Rectangle;
  7. import java.awt.Toolkit;
  8. import java.awt.image.BufferedImage;
  9. import java.awt.image.DataBufferByte;
  10. import java.io.File;
  11. import javax.imageio.ImageIO;
  12. import java.io.IOException;
  13.  
  14. public class ClickMouse extends javax.swing.JFrame {
  15.  
  16.    public static void main(String args[]) {
  17.        try {
  18.            Robot robot = new Robot();
  19.            Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
  20.            BufferedImage bufferedImage = robot.createScreenCapture(captureSize);
  21.            marchThroughImage(bufferedImage);
  22.  
  23.            /*File outputfile = new File("image.jpg");
  24.             ImageIO.write(bufferedImage, "jpg", outputfile);*/
  25.        } catch (AWTException e) {
  26.            e.printStackTrace();
  27.        } /*catch (IOException e) {
  28.             e.printStackTrace();
  29.         }*/
  30.    }
  31.  
  32.    private static void marchThroughImage(BufferedImage image) {
  33.        int w = image.getWidth();
  34.        int h = image.getHeight();
  35.        System.out.println("width, height: " + w + ", " + h);
  36.  
  37.        for (int i = 0; i < h; i++) {
  38.            for (int j = 0; j < w; j++) {
  39.                System.out.println("x,y: " + j + ", " + i);
  40.                int pixel = image.getRGB(j, i);
  41.                printPixelARGB(pixel);
  42.                System.out.println("");
  43.            }
  44.        }
  45.    }
  46.  
  47.    public static void printPixelARGB(int pixel) {
  48.        int alpha = (pixel >> 24) & 0xff;
  49.        int red = (pixel >> 16) & 0xff;
  50.        int green = (pixel >> 8) & 0xff;
  51.        int blue = (pixel) & 0xff;
  52.        System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);
  53.    }
  54.  
  55. }
  56.  

Lo que hace primero es hacer una captura de pantalla, después la guarda en el buffer y de ahí muestra el rgb de los pixeles.

Podrías ajustarlo para guardarlo en un array, además de la posición y después compararlo con el color que definas.

Espero que sea algo parecido a lo que necesitas.

Saludos.


Título: Re: Java Colores
Publicado por: TriBlack en 16 Agosto 2013, 04:21 am
Algo así podría servirte.

Código
  1. package Intermediate;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Robot;
  5. import java.awt.AWTException;
  6. import java.awt.Rectangle;
  7. import java.awt.Toolkit;
  8. import java.awt.image.BufferedImage;
  9. import java.awt.image.DataBufferByte;
  10. import java.io.File;
  11. import javax.imageio.ImageIO;
  12. import java.io.IOException;
  13.  
  14. public class ClickMouse extends javax.swing.JFrame {
  15.  
  16.    public static void main(String args[]) {
  17.        try {
  18.            Robot robot = new Robot();
  19.            Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
  20.            BufferedImage bufferedImage = robot.createScreenCapture(captureSize);
  21.            marchThroughImage(bufferedImage);
  22.  
  23.            /*File outputfile = new File("image.jpg");
  24.             ImageIO.write(bufferedImage, "jpg", outputfile);*/
  25.        } catch (AWTException e) {
  26.            e.printStackTrace();
  27.        } /*catch (IOException e) {
  28.             e.printStackTrace();
  29.         }*/
  30.    }
  31.  
  32.    private static void marchThroughImage(BufferedImage image) {
  33.        int w = image.getWidth();
  34.        int h = image.getHeight();
  35.        System.out.println("width, height: " + w + ", " + h);
  36.  
  37.        for (int i = 0; i < h; i++) {
  38.            for (int j = 0; j < w; j++) {
  39.                System.out.println("x,y: " + j + ", " + i);
  40.                int pixel = image.getRGB(j, i);
  41.                printPixelARGB(pixel);
  42.                System.out.println("");
  43.            }
  44.        }
  45.    }
  46.  
  47.    public static void printPixelARGB(int pixel) {
  48.        int alpha = (pixel >> 24) & 0xff;
  49.        int red = (pixel >> 16) & 0xff;
  50.        int green = (pixel >> 8) & 0xff;
  51.        int blue = (pixel) & 0xff;
  52.        System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);
  53.    }
  54.  
  55. }
  56.  

Lo que hace primero es hacer una captura de pantalla, después la guarda en el buffer y de ahí muestra el rgb de los pixeles.

Podrías ajustarlo para guardarlo en un array, además de la posición y después compararlo con el color que definas.

Espero que sea algo parecido a lo que necesitas.

Saludos.

Gracias amigo me ha servido mucho... y si las iré guardando en arrays tanto los colores comos las coordenadas para luego mover el mouse a esa coordenada ^^ de nuevo muchas gracias  :D


Título: Re: Java Colores
Publicado por: TriBlack en 21 Agosto 2013, 04:36 am
Algo así podría servirte.

Código
  1. package Intermediate;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Robot;
  5. import java.awt.AWTException;
  6. import java.awt.Rectangle;
  7. import java.awt.Toolkit;
  8. import java.awt.image.BufferedImage;
  9. import java.awt.image.DataBufferByte;
  10. import java.io.File;
  11. import javax.imageio.ImageIO;
  12. import java.io.IOException;
  13.  
  14. public class ClickMouse extends javax.swing.JFrame {
  15.  
  16.    public static void main(String args[]) {
  17.        try {
  18.            Robot robot = new Robot();
  19.            Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
  20.            BufferedImage bufferedImage = robot.createScreenCapture(captureSize);
  21.            marchThroughImage(bufferedImage);
  22.  
  23.            /*File outputfile = new File("image.jpg");
  24.             ImageIO.write(bufferedImage, "jpg", outputfile);*/
  25.        } catch (AWTException e) {
  26.            e.printStackTrace();
  27.        } /*catch (IOException e) {
  28.             e.printStackTrace();
  29.         }*/
  30.    }
  31.  
  32.    private static void marchThroughImage(BufferedImage image) {
  33.        int w = image.getWidth();
  34.        int h = image.getHeight();
  35.        System.out.println("width, height: " + w + ", " + h);
  36.  
  37.        for (int i = 0; i < h; i++) {
  38.            for (int j = 0; j < w; j++) {
  39.                System.out.println("x,y: " + j + ", " + i);
  40.                int pixel = image.getRGB(j, i);
  41.                printPixelARGB(pixel);
  42.                System.out.println("");
  43.            }
  44.        }
  45.    }
  46.  
  47.    public static void printPixelARGB(int pixel) {
  48.        int alpha = (pixel >> 24) & 0xff;
  49.        int red = (pixel >> 16) & 0xff;
  50.        int green = (pixel >> 8) & 0xff;
  51.        int blue = (pixel) & 0xff;
  52.        System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);
  53.    }
  54.  
  55. }
  56.  

Lo que hace primero es hacer una captura de pantalla, después la guarda en el buffer y de ahí muestra el rgb de los pixeles.

Podrías ajustarlo para guardarlo en un array, además de la posición y después compararlo con el color que definas.

Espero que sea algo parecido a lo que necesitas.

Saludos.

Buenas amigo... la verdad tu metodo me ha funcionado pero es algo lento :S ya que la imagen es una 800 * 600 y podras imaginar lo que tarde en recorrerla pixel por pixel ¿ No existe otro metodo XD ?


Título: Re: Java Colores
Publicado por: 1mpuls0 en 21 Agosto 2013, 16:31 pm
No sé que tiempo te tomó en recorrer la imagen pero en mi caso fue una imagen mayor y por lo que debe hacer el algoritmo es un tiempo considerablemente aceptado.

No sé si existe otro método.

Saludos.


Título: Re: Java Colores
Publicado por: TriBlack en 22 Agosto 2013, 18:38 pm
No sé que tiempo te tomó en recorrer la imagen pero en mi caso fue una imagen mayor y por lo que debe hacer el algoritmo es un tiempo considerablemente aceptado.

No sé si existe otro método.

Saludos.

Buenas amigo he conseguido otro metodo y es mas rapido por lo que he visto solo tengo un problema el valor que arroja lo da en argb y en negativo de casualidad sabes como pasarlo de argb a rgb ¿?

Aqui el metodo

Código
  1. int[][] result = new int[height][width];
  2.      if (hasAlphaChannel) {
  3.         final int pixelLength = 4;
  4.         for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
  5.            int argb = 0;
  6.  
  7.            argb += (((int) pixels[pixel] & 0xff) << 24); // alpha
  8.            argb += ((int) pixels[pixel + 1] & 0xff); // blue
  9.            argb += (((int) pixels[pixel + 2] & 0xff) << 8); // green
  10.            argb += (((int) pixels[pixel + 3] & 0xff) << 16); // red
  11.            result[row][col] = argb;
  12.  
  13.            col++;
  14.            if (col == width) {
  15.               col = 0;
  16.               row++;
  17.            }
  18.         }
  19.      } else {
  20.         final int pixelLength = 3;
  21.         for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
  22.            int argb = 0;
  23.  
  24.            argb += -16777216; // 255 alpha
  25.            argb += ((int) pixels[pixel] & 0xff); // blue
  26.            argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
  27.            argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
  28.            result[row][col] = argb;
  29.            col++;
  30.            if (col == width) {
  31.               col = 0;
  32.               row++;
  33.            }
  34.         }
  35.      }
  36.  
  37.      return result;
  38.   }
  39.  
  40.  

Todo queda guardado en la matriz pero si la muestras los resultados son numeros negativos y en arbg como te dije arriba :S