Java Colores

Iniciado por TriBlack, 14 Agosto 2013, 22:47 PM

0 Miembros y 1 Visitante están viendo este tema.

TriBlack

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 :)

1mpuls0

Código (java) [Seleccionar]

try {
            Robot robot = new Robot();

            Color color = robot.getPixelColor(500, 500);

            System.out.println("Red   = " + color.getRed());
            System.out.println("Green = " + color.getGreen());
            System.out.println("Blue  = " + color.getBlue());

        } catch (AWTException e) {
            e.printStackTrace();
        }


Con mouseClicked obtienes las coordenadas donde se hizo clic.

Saludos.
abc

TriBlack

Cita de: Darhius en 14 Agosto 2013, 23:27 PM
Código (java) [Seleccionar]

try {
            Robot robot = new Robot();

            Color color = robot.getPixelColor(500, 500);

            System.out.println("Red   = " + color.getRed());
            System.out.println("Green = " + color.getGreen());
            System.out.println("Blue  = " + color.getBlue());

        } catch (AWTException e) {
            e.printStackTrace();
        }


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  :-\

1mpuls0

Algo así podría servirte.

Código (java) [Seleccionar]

package Intermediate;

import java.awt.Color;
import java.awt.Robot;
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class ClickMouse extends javax.swing.JFrame {

    public static void main(String args[]) {
        try {
            Robot robot = new Robot();
            Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            BufferedImage bufferedImage = robot.createScreenCapture(captureSize);
            marchThroughImage(bufferedImage);

            /*File outputfile = new File("image.jpg");
            ImageIO.write(bufferedImage, "jpg", outputfile);*/
        } catch (AWTException e) {
            e.printStackTrace();
        } /*catch (IOException e) {
            e.printStackTrace();
        }*/
    }
   
    private static void marchThroughImage(BufferedImage image) {
        int w = image.getWidth();
        int h = image.getHeight();
        System.out.println("width, height: " + w + ", " + h);

        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                System.out.println("x,y: " + j + ", " + i);
                int pixel = image.getRGB(j, i);
                printPixelARGB(pixel);
                System.out.println("");
            }
        }
    }
   
    public static void printPixelARGB(int pixel) {
        int alpha = (pixel >> 24) & 0xff;
        int red = (pixel >> 16) & 0xff;
        int green = (pixel >> 8) & 0xff;
        int blue = (pixel) & 0xff;
        System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);
    }

}


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.
abc

TriBlack

Cita de: Darhius en 15 Agosto 2013, 05:58 AM
Algo así podría servirte.

Código (java) [Seleccionar]

package Intermediate;

import java.awt.Color;
import java.awt.Robot;
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class ClickMouse extends javax.swing.JFrame {

    public static void main(String args[]) {
        try {
            Robot robot = new Robot();
            Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            BufferedImage bufferedImage = robot.createScreenCapture(captureSize);
            marchThroughImage(bufferedImage);

            /*File outputfile = new File("image.jpg");
            ImageIO.write(bufferedImage, "jpg", outputfile);*/
        } catch (AWTException e) {
            e.printStackTrace();
        } /*catch (IOException e) {
            e.printStackTrace();
        }*/
    }
   
    private static void marchThroughImage(BufferedImage image) {
        int w = image.getWidth();
        int h = image.getHeight();
        System.out.println("width, height: " + w + ", " + h);

        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                System.out.println("x,y: " + j + ", " + i);
                int pixel = image.getRGB(j, i);
                printPixelARGB(pixel);
                System.out.println("");
            }
        }
    }
   
    public static void printPixelARGB(int pixel) {
        int alpha = (pixel >> 24) & 0xff;
        int red = (pixel >> 16) & 0xff;
        int green = (pixel >> 8) & 0xff;
        int blue = (pixel) & 0xff;
        System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);
    }

}


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

TriBlack

Cita de: Darhius en 15 Agosto 2013, 05:58 AM
Algo así podría servirte.

Código (java) [Seleccionar]

package Intermediate;

import java.awt.Color;
import java.awt.Robot;
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class ClickMouse extends javax.swing.JFrame {

    public static void main(String args[]) {
        try {
            Robot robot = new Robot();
            Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            BufferedImage bufferedImage = robot.createScreenCapture(captureSize);
            marchThroughImage(bufferedImage);

            /*File outputfile = new File("image.jpg");
            ImageIO.write(bufferedImage, "jpg", outputfile);*/
        } catch (AWTException e) {
            e.printStackTrace();
        } /*catch (IOException e) {
            e.printStackTrace();
        }*/
    }
   
    private static void marchThroughImage(BufferedImage image) {
        int w = image.getWidth();
        int h = image.getHeight();
        System.out.println("width, height: " + w + ", " + h);

        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                System.out.println("x,y: " + j + ", " + i);
                int pixel = image.getRGB(j, i);
                printPixelARGB(pixel);
                System.out.println("");
            }
        }
    }
   
    public static void printPixelARGB(int pixel) {
        int alpha = (pixel >> 24) & 0xff;
        int red = (pixel >> 16) & 0xff;
        int green = (pixel >> 8) & 0xff;
        int blue = (pixel) & 0xff;
        System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);
    }

}


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 ?

1mpuls0

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.
abc

TriBlack

Cita de: Darhius 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.

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 (java) [Seleccionar]

int[][] result = new int[height][width];
      if (hasAlphaChannel) {
         final int pixelLength = 4;
         for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
            int argb = 0;

            argb += (((int) pixels[pixel] & 0xff) << 24); // alpha
            argb += ((int) pixels[pixel + 1] & 0xff); // blue
            argb += (((int) pixels[pixel + 2] & 0xff) << 8); // green
            argb += (((int) pixels[pixel + 3] & 0xff) << 16); // red
            result[row][col] = argb;
           
            col++;
            if (col == width) {
               col = 0;
               row++;
            }
         }
      } else {
         final int pixelLength = 3;
         for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
            int argb = 0;
           
            argb += -16777216; // 255 alpha
            argb += ((int) pixels[pixel] & 0xff); // blue
            argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
            argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
            result[row][col] = argb;
            col++;
            if (col == width) {
               col = 0;
               row++;
            }
         }
      }

      return result;
   }



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