49 votes

Java BufferedImage récupérant le rouge, le vert et le bleu individuellement

El getRGB() renvoie un seul int. Comment puis-je obtenir individuellement les couleurs rouge, verte et bleue sous forme de valeurs comprises entre 0 et 255 ?

120voto

João Silva Points 36619

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

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

Ainsi, pour obtenir les différentes composantes de la couleur, il suffit 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 le 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       }

73voto

Michael Mrozek Points 44120

Java Couleur peut effectuer la conversion :

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

0 votes

Créer un nouveau Color instance de chaque pixel d'une image génère beaucoup de déchets et peut être très inefficace. Si vous envisagez de traiter chaque pixel d'une image, il est beaucoup plus efficace d'obtenir la couleur RVB de chaque pixel avec bufferedImage.getRGB(x,y) et extraire les composantes rouge, verte et bleue comme décrit dans la réponse de João Silva.

8voto

Matti Virkkunen Points 31633

Vous aurez besoin d'un peu d'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, je ne m'en souviens pas et la documentation ne me donne pas de réponse immédiate).

7voto

Defd Points 336

Pour de simples manipulations de couleurs, vous pouvez utiliser

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

Le canal de sortie 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 possède 3 canaux et une image RGBA en possède 4.

Cette méthode a 3 types de sortie : int, float et double. Pour obtenir une valeur de couleur comprise entre 0 et 255, le paramètre outputChannels doit être un tableau int[].

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X