Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java BufferedImage getting red, green and blue individually

The getRGB() method returns a single int. How can I get individually the red, green and blue colors all as the values between 0 and 255?

like image 752
deltanovember Avatar asked Apr 11 '10 00:04

deltanovember


3 Answers

A pixel is represented by a 4-byte (32 bit) integer, like so:

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

So, to get the individual color components, you just need a bit of binary arithmetic:

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

This is indeed what the java.awt.Color class methods do:

  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       }
like image 86
João Silva Avatar answered Nov 12 '22 01:11

João Silva


Java's Color class can do the conversion:

Color c = new Color(image.getRGB());
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();
like image 73
Michael Mrozek Avatar answered Nov 12 '22 02:11

Michael Mrozek


You'll need some basic binary arithmetic to split it up:

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

(Or possibly the other way round, I honestly can't remember and the documentation isn't giving me an instant answer)

like image 8
Matti Virkkunen Avatar answered Nov 12 '22 00:11

Matti Virkkunen