Java BufferedImage obtiene rojo, verde y azul individualmente

El método getRGB devuelve un único int. ¿Cómo puedo obtener individualmente los colores rojo, verde y azul como valores entre 0 y 255?

La clase de Color de Java puede hacer la conversión:

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

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

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

Entonces, para obtener los componentes de color individuales, solo necesitas 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 de hecho lo que hacen los métodos java.awt.Color class:

  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 } 

Necesitarás una aritmética binaria básica para dividirla:

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

(O posiblemente al revés, sinceramente no puedo recordar y la documentación no me da una respuesta instantánea)

Para manipulaciones de color simples, puede usar

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

El 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 [].