web-dev-qa-db-fra.com

Java BufferedImage devient rouge, vert et bleu individuellement

La méthode getRGB() renvoie un seul int. Comment puis-je obtenir individuellement les couleurs rouge, vert et bleu en tant que valeurs comprises entre 0 et 255?

48
deltanovember

Java Color class peut faire la conversion:

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

Un pixel est représenté par un entier de 4 octets (32 bits), comme suit:

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

Donc, pour obtenir les composants de couleur individuels, vous avez juste besoin d'un peu d'arithmétique binaire:

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

C'est en effet ce que le Java.awt.Color les méthodes de classe font:

  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       }
112
João Silva

Vous aurez besoin d'une arithmétique binaire de base pour le diviser:

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

(Ou peut-être l'inverse, honnêtement, je ne me souviens pas et la documentation ne me donne pas de réponse instantanée)

8
Matti Virkkunen

Pour les manipulations de couleurs simples, vous pouvez utiliser

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

Le OutputChannels est un tableau pour stocker le pixel récupéré. Sa longueur dépend du nombre réel de canaux de votre image. Par exemple, une image RVB a 3 canaux; et une image RGBA a 4 canaux.

Cette méthode a 3 types de sortie: int, float et double. Pour obtenir une plage de valeurs de couleur de 0 à 255, votre paramètre outputChannels réel doit être un tableau int [].

7
Defd