Co robi "& 0xff"?

Próbuję zrozumieć poniższy kod, gdzie b jest daną liczbą całkowitą, a {[2] } jest obrazkiem.

Rozumiem, że jeśli wartość RGB w danym punkcie I, j jest większa niż b, to ustaw ten piksel na biały, a inny na czarny. więc przekonwertować obraz na czarno-biały.

Jednak jestem zagubiony w tym, co (& 0xff) faktycznie robi, zgaduję, że to rodzaj binarnego przesunięcia?

if ((image.getRGB(i, j) & 0xff) > b) {
    image.setRGB(i, j, 0xffffff) ;
} else {
    image.setRGB(i, j, 0x000000);
}
Author: Lunar, 2011-05-25

5 answers

To tak zwana Maska. Chodzi o to, że otrzymujesz wartość RGB w jednej liczbie całkowitej, z jednym bajtem dla każdego komponentu. Coś jak 0xAARRGGBB (Alfa, czerwony, zielony, niebieski). Wykonując bitwise - i z 0xFF, zachowujesz tylko ostatnią część, która jest niebieska. Dla innych kanałów można użyć:

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

W przypadku Alfy, możesz pominąć & 0xFF, ponieważ nic nie robi; to samo dla przesunięcia o 0 W przypadku niebieskim.

 38
Author: xs0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-03 07:53:58

The

& 0xFF

Jest uzyskanie jednego ze składników Koloru (czerwony lub niebieski, zapomniałem który).

Jeśli maska kolorów nie jest wykonywana, rozważ RGB (0, 127, 0) i próg 63. GetRGB(...) call would return

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

, która jest wyraźnie większa niż próg 63. Ale intencją było zignorowanie pozostałych dwóch kanałów kolorów. Maska bitowa pobiera tylko najniższe 8 bitów, z wartością zero.

The

> b

Sprawdza czy kolor jest jaśniejszy od próg szczególny, "b".

Jeśli próg zostanie przekroczony, piksel będzie kolorowany na biało, używając

image.setRGB(i,j,0xffffff)

... w przeciwnym razie kolor jest czarny, używając

image.setRGB(i,j,0x000000)

Jest to więc konwersja na czerń i biel oparta na prostym progu piksel po pikselu na jednokolorowym kanale.

 11
Author: Dilum Ranatunga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 15:03:32

Prawdopodobnie dlatego, że istnieje konwersja do lub z ARGB. to jest naprawdę dobry post na blogu o tym, dlaczego robić bitowe operacje dla kolorów.

 4
Author: Joseph Hansen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-12 23:55:49

Reprezentacja kolorów

Wartość RGB jest liczbą całkowitą, więc jest reprezentowana w pamięci przez 4 bajty (lub równoważnie 32 bity).

Przykład:

00000001 00000010 00000011 00000100

Każdy bajt reprezentuje jeden składnik koloru :

  • pierwszy bajt: wartość alfa (w przykładzie 00000001), która odpowiada nieprzezroczystości
  • drugi bajt: czerwona wartość (00000010 w przykładzie)
  • trzeci bajt: Zielona wartość (00000011 w przykładzie)
  • 4. bajt: wartość niebieska (00000100 w przykład)

0xff i 0xfffffff symbole

0xFF reprezentuje wartość szesnastkową FF, która jest równa liczbie całkowitej 255. Jego reprezentacja binarna to:

00000000 00000000 00000000 11111111

Podobnie 0xffffff jest reprezentowane przez:

00000000 11111111 11111111 11111111

Odpowiada kolorowi białemu (czerwonemu, zielonemu i niebieskiemu równemu 255).

& operator

Operator binarny i "&" jest stosowany na dwóch liczbach całkowitych i1 I i2 (i1 & i2). Zwraca liczbę całkowitą ze wszystkimi jej bitami równymi 0 z wyjątkiem tych, które są równe 1 zarówno w i1, jak i i2. Na przykład, jeśli zastosujemy & na moim pierwszym przykładzie i na 0xff, otrzymamy:

00000000 00000000 00000000 00000100

W konsekwencji (&0xff) pozwala zachować tylko wartości ostatniego bajtu (tzn. wartość niebieskiego składnika koloru).

// 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
Author: Zach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 08:11:20

& 0xff jest bitowe i

(image.getRGB(i,j)&0xff) pobiera niebieską wartość RGB zakodowanej int zwracanej przez getRGB część > b sprawdza, czy jest większa niż jakiś próg

 0
Author: ratchet freak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 14:58:59