2010-04-11 15 views

Respuesta

69

clase de Java Color puede hacer la conversión:

Color c = new Color(image.getRGB()); 
int red = c.getRed(); 
int green = c.getGreen(); 
int blue = c.getBlue(); 
+0

Crear una nueva instancia 'Color' de cada píxel de una imagen genera una gran cantidad de basura y puede ser * muy * ineficiente. Si planea procesar cada píxel de una imagen, es mucho más eficiente obtener el color RGB de cada píxel con 'bufferImage.getRGB (x, y)', y extraer los componentes rojo, verde y azul como se describe en la respuesta por João Silva. – Marco13

7

que necesitará un poco de aritmética binaria básica para dividirlo:

int blue = rgb & 0xFF; 
int green = (rgb >> 8) & 0xFF; 
int red = (rgb >> 16) & 0xFF; 

(O, posiblemente, a la inversa, honestamente puedo lo recuerdo y la documentación no me da una respuesta instantánea)

+0

Creo que tienes razón. – HyperNeutrino

105

Un píxel está representado por un entero de 4 bytes (32 bits), como el siguiente:

00000000 00000000 00000000 11111111 
^ Alpha ^Red  ^Green ^Blue 

Por lo tanto, para obtener los componentes de color individuales, sólo se necesita un poco de aritmética binaria:

int rgb = getRGB(...); 
int red = (rgb >> 16) & 0x000000FF; 
int green = (rgb >>8) & 0x000000FF; 
int blue = (rgb) & 0x000000FF; 

Esto es precisamente lo que los métodos de la clase java.awt.Color hacen:

553  /** 
    554  * Returns the red component in the range 0-255 in the default sRGB 
    555  * space. 
    556  * @return the red component. 
    557  * @see #getRGB 
    558  */ 
    559  public int getRed() { 
    560   return (getRGB() >> 16) & 0xFF; 
    561  } 
    562 
    563  /** 
    564  * Returns the green component in the range 0-255 in the default sRGB 
    565  * space. 
    566  * @return the green component. 
    567  * @see #getRGB 
    568  */ 
    569  public int getGreen() { 
    570   return (getRGB() >> 8) & 0xFF; 
    571  } 
    572 
    573  /** 
    574  * Returns the blue component in the range 0-255 in the default sRGB 
    575  * space. 
    576  * @return the blue component. 
    577  * @see #getRGB 
    578  */ 
    579  public int getBlue() { 
    580   return (getRGB() >> 0) & 0xFF; 
    581  } 
6

Para sencilla manipulaciones de color, puede usar

bufImg.getRaster().getPixel(x,y,outputChannels) 

OutputChannels es una matriz para almacenar el píxel recuperado. Su longitud depende del recuento de canales reales de su imagen. Por ejemplo, una imagen RGB tiene 3 canales; y una imagen RGBA tiene 4 canales.

Este método tiene 3 tipos de salida: int, float y double. Para obtener un rango de valores de color de 0 ~ 255, el parámetro real outputChannels debe ser una matriz int [].

Cuestiones relacionadas