Que fait" & 0xff"?

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

Je comprends que si la valeur RVB au point donné i, j est supérieure à b, alors définissez ce pixel sur blanc, sinon sur noir. ainsi convertirait l'image en noir et blanc.

Cependant, je suis perdu à ce que (&0xff) fait réellement, je devine 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);
}
32
demandé sur Lunar 2011-05-25 18:54:09

5 réponses

C'est un soi-disant masque. La chose est, vous obtenez la valeur RVB tout en un entier, avec un octet pour chaque composant. Quelque chose comme 0xAARRGGBB (alpha, rouge, vert, bleu). En effectuant un bit-et avec 0xFF, vous ne gardez que la dernière partie, qui est bleue. Pour les autres canaux, vous utiliseriez:

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

Dans le cas alpha, vous pouvez ignorer & 0xFF, car cela ne fait rien; idem pour le décalage de 0 dans le cas Bleu.

38
répondu xs0 2017-10-03 07:53:58

Le

& 0xFF

Obtient l'un des composants de couleur (rouge ou bleu, j'oublie lequel).

Si le masque de couleur n'est pas exécuté, considérez RVB (0, 127, 0) et le seuil 63. Le getRGB(...) l'appel retournerait

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

Qui est nettement supérieur au seuil 63. Mais l'intention était d'ignorer les deux autres canaux de couleur. Le masque de bits n'obtient que les 8 bits les plus bas, avec zéro.

Le

> b

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

Si le seuil est dépassé, le pixel est de couleur blanche, en utilisant

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.

11
répondu Dilum Ranatunga 2011-05-25 15:03:32

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.

4
répondu Joseph Hansen 2014-12-12 23:55:49

Représentation des couleurs

La valeur RVB est un entier donc elle est représentée en mémoire par 4 octets (ou de manière équivalente 32 bits).

Exemple:

00000001 00000010 00000011 00000100

Chaque octet représente un composant de la couleur:

  • 1er octet: valeur alpha (00000001 dans l'exemple) qui correspond à l'opacité
  • 2ème octet: valeur Rouge (00000010 dans l'exemple)
  • 3ème octet: valeur verte (00000011 dans l'exemple)
  • 4ème octet: valeur bleue (00000100 in 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 égal à 255).

& opérateur

L'opérateur binaire "&" est appliquée sur deux entiers i1 et i2 (i1 & i2). Il renvoie un entier avec tous ses bits égaux à 0 sauf ceux qui sont égaux à 1 dans i1 et i2. Par exemple, si nous appliquons & 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 du composant bleu 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);
}
4
répondu Zach 2016-08-03 08:11:20

& 0xff est un bit et

(image.getRGB(i,j)&0xff) obtient la valeur bleue de l'int encodé RVB renvoyé par getRGB la partie > b vérifie si elle est supérieure à un certain seuil

0
répondu ratchet freak 2011-05-25 14:58:59