web-dev-qa-db-fra.com

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, définissez ce pixel sur blanc, sinon sur noir. convertirait ainsi l'image en noir et blanc.

Cependant, je suis perdu dans 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);
}
39
Lunar

C'est un soi-disant masque. Le fait est que vous obtenez la valeur RVB dans un seul entier, avec un octet pour chaque composant. Quelque chose comme 0xAARRGGBB (alpha, rouge, vert, bleu). En effectuant un bit à bit et avec 0xFF, vous ne gardez que la dernière partie, qui est bleue. Pour les autres chaînes, 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 il ne fait rien; idem pour le décalage de 0 dans le cas bleu.

45
xs0

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 RGB (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 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 lumineuse 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 seuil pixel par pixel simple sur un seul canal de couleur.

12
Dilum Ranatunga

Représentation des couleurs

La valeur RVB est un entier, elle est donc représentée en mémoire par 4 octets (ou équivalent 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)
  • 3e octet: valeur verte (00000011 dans l'exemple)
  • 4ème octet: valeur bleue (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 blanc (rouge, vert et bleu égal à 255).

& opérateur

L'opérateur binaire et "&" est appliqué sur deux entiers i1 et i2 (i1 & i2). Il retourne 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, nous obtenons:

00000000 00000000 00000000 00000100

Par conséquent, (& 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);
}
5
Zach

C'est probablement parce qu'il y a une conversion vers ou depuis ARGB. Ceci est un très bon article de blog sur la raison pour laquelle effectuer des opérations au niveau des bits pour les couleurs.

4
Joseph Hansen

& 0xff est un bit ET

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

0
ratchet freak