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