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);
}
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.
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.
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:
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);
}
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.
& 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