41 votes

Que fait "& 0xff" ?

J'essaie de comprendre le code ci-dessous où b est un nombre entier donné et image est une image.

Je comprends que si la valeur RVB à un point donné i,j est supérieure à b, alors ce pixel est mis en blanc, sinon il est mis en noir, ce qui convertit l'image en noir et blanc.

Cependant, je ne sais pas ce que fait (& 0xff), je suppose que c'est une sorte de décalage binaire ?

if ((image.getRGB(i, j) & 0xff) > b) {
    image.setRGB(i, j, 0xffffff) ;
} else {
    image.setRGB(i, j, 0x000000);
}

48voto

xs0 Points 668

C'est un soi-disant masque. Le fait est que vous obtenez la valeur RVB en un seul entier, avec un octet pour chaque composante. Quelque chose comme 0xAARRGGBB (alpha, rouge, vert, bleu). En effectuant un bit-and avec 0xFF, vous ne gardez que la dernière partie, qui est le bleu. Pour les autres canaux, on utilise :

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

Dans le cas de l'alpha, vous pouvez sauter & 0xFF Il en va de même pour le décalage par 0 dans le cas du bleu.

12voto

Dilum Ranatunga Points 7677

Le site

& 0xFF

reçoit l'un des composants de couleur (rouge ou bleu, j'ai oublié lequel).

Si le masque de couleur n'est pas effectué, on considère RVB (0, 127, 0), et le seuil 63. L'appel getRGB(...) retournerait

(0 * 256 * 256) + (127 * 256) + 0 = 32512

Ce qui est clairement plus que le seuil de 63. Mais l'intention était d'ignorer les deux autres canaux de couleur. Le masque binaire ne récupère que les 8 bits les plus bas, dont zéro.

Le site

> b

vérifie si la couleur est plus brillante qu'un seuil particulier, 'b'.

Si le seuil est dépassé, le pixel est coloré en blanc, à l'aide de la fonction

image.setRGB(i,j,0xffffff)

... sinon il est coloré en noir, en utilisant

image.setRGB(i,j,0x000000)

Il s'agit donc d'une conversion en noir et blanc basée sur un simple seuil pixel par pixel sur un seul canal de couleur.

12voto

Zach Points 470

Représentation des couleurs

La valeur RVB est un nombre entier, elle est donc représentée en mémoire par 4 octets (ou équivalents à 32 bits).

Exemple :

00000001 00000010 00000011 00000100

Chaque octet représente une composante de la couleur :

  • 1er octet : valeur alpha (00000001 dans l'exemple) qui correspond à l'opacité
  • 2ème octet : valeur du rouge (00000010 dans l'exemple)
  • 3ème octet : valeur du vert (00000011 dans l'exemple)
  • 4ème octet : valeur du bleu (00000100 dans l'exemple)

Symboles 0xff et 0xffffff

0xff représente la valeur hexadécimale FF qui est égale à l'entier 255. Sa représentation binaire est :

00000000 00000000 00000000 11111111

De même, 0xffffff est représenté par :

00000000 11111111 11111111 11111111

Il correspond à la couleur blanche (rouge, vert et bleu égaux à 255).

& opérateur

L'opérateur binaire et "&" est appliqué sur deux entiers i1 et i2 (i1 & i2). Il retourne un entier dont tous les bits sont égaux à 0 sauf ceux qui sont égaux à 1 dans i1 et i2. Par exemple, si on applique & sur mon premier exemple et sur 0xff, on obtient :

00000000 00000000 00000000 00000100

En conséquence, (& 0xff) permet de ne conserver que les valeurs du dernier octet (c'est-à-dire la valeur de la composante bleue de la couleur).

// If the blue component of image.getRGB(i, j) is greater than b
if ((image.getRGB(i, j) & 0xff) > b) {
    // Set the image to white
    image.setRGB(i, j, 0xffffff) ;
} else {
    // Set the image to black
    image.setRGB(i, j, 0x000000);
}

4voto

johsephm Points 769

C'est probablement parce qu'il y a une conversion vers ou depuis ARGB. C'est un très bon article de blog sur pourquoi faire des opérations bit-wise pour les couleurs.

0voto

ratchet freak Points 22412

& 0xff est un ET binaire

(image.getRGB(i,j)&0xff) obtient la valeur bleue de l'int encodé rgb retourné par getRGB le site > b vérifier en partie si elle est supérieure à un certain seuil

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