Java BufferedImage getting red, green and blue individually

前端 未结 4 1138
时光取名叫无心
时光取名叫无心 2020-11-27 02:23

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?

相关标签:
4条回答
  • 2020-11-27 03:03

    For simple color manipulations, you can use

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

    The outputChannels is an array for storing the fetched pixel. Its length depends on your image's actual channel count. For example, an RGB image has 3 channels; and an RGBA image has 4 channels.

    This method has 3 output types: int, float and double. To get a color value ranges from 0~255, your actual parameter outputChannels should be an int[] array.

    0 讨论(0)
  • 2020-11-27 03:06

    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();
    
    0 讨论(0)
  • 2020-11-27 03:11

    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       }
    
    0 讨论(0)
  • 2020-11-27 03:22

    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)

    0 讨论(0)
提交回复
热议问题