Java BufferedImage obtendo vermelho, verde e azul individualmente

O método getRGB retorna um único int. Como posso obter individualmente as colors vermelha, verde e azul como valores entre 0 e 255?

A class Color do Java pode fazer a conversão:

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

Um pixel é representado por um inteiro de 4 bytes (32 bits), assim:

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

Então, para obter os componentes de cor individuais, você só precisa de um pouco de aritmética binária:

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

Isto é realmente o que os methods da class java.awt.Color fazem:

  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 } 

Você precisará de alguma aritmética binária básica para dividir:

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

(Ou possivelmente o contrário, eu honestamente não me lembro e a documentação não está me dando uma resposta instantânea)

Para manipulações de colors simples, você pode usar

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

O outputChannels é uma matriz para armazenar o pixel buscado. Seu comprimento depende da contagem real de canais da sua imagem. Por exemplo, uma imagem RGB tem 3 canais; e uma imagem RGBA tem 4 canais.

Este método possui 3 tipos de saída: int, float e double. Para obter um valor de cor varia de 0 a 255, seu parâmetro real outputChannels deve ser um array int [].