Что делает "& 0xff"?
Я пытаюсь понять код ниже, где b
- заданное целое число, а image
- это изображение.
Я понимаю, что если значение RGB в заданной точке i, j больше, чем b, установите для этого пикселя в белый еще черный. поэтому преобразование изображения в черно-белое.
Однако я потерял то, что на самом деле (& 0xff), я предполагаю, что это своего рода двоичный сдвиг?
if ((image.getRGB(i, j) & 0xff) > b) {
image.setRGB(i, j, 0xffffff) ;
} else {
image.setRGB(i, j, 0x000000);
}
Ответы
Ответ 1
Это так называемая маска. Дело в том, что вы получаете значение RGB в одном целое, с одним байтом для каждого компонента. Что-то вроде 0xAARRGGBB (альфа, красный, зеленый, синий). Выполняя поразрядное - и с 0xFF вы сохраняете только последнюю часть, которая является синей. Для других каналов вы должны использовать:
int alpha = (rgb >>> 24) & 0xFF;
int red = (rgb >>> 16) & 0xFF;
int green = (rgb >>> 8) & 0xFF;
int blue = (rgb >>> 0) & 0xFF;
В альфа-случае вы можете пропустить & 0xFF
, потому что он ничего не делает; то же самое для сдвига на 0 в синем случае.
Ответ 2
& 0xFF
получает один из компонентов цвета (красный или синий, я забываю, что).
Если цветовая маска не выполнена, рассмотрите RGB (0, 127, 0) и порог 63. Вызов getRGB (...) вернет
(0 * 256 * 256) + (127 * 256) + 0 = 32512
Это явно больше порога 63. Но целью было проигнорировать два других цветовых канала. Битовая маска получает только самые младшие 8 бит, с нулем.
> b
проверяет, ярче ли цвет, чем определенный порог, 'b'.
Если порог превышен, пиксель окрашен в белый цвет, используя
image.setRGB(i,j,0xffffff)
... в противном случае он окрашен в черный цвет, используя
image.setRGB(i,j,0x000000)
Таким образом, это преобразование в черно-белое на основе простого пиксельно-пиксельного порога на одном цветовом канале.
Ответ 3
Возможно, это связано с тем, что есть некоторая конверсия в ARGB или из нее. Это действительно хорошее сообщение в блоге о том, почему нужно делать побитовые операции для цветов.
Ответ 4
Цветное представление
Значение RGB представляет собой целое число, поэтому оно представляется в памяти на 4 байта (или эквивалентно 32 бита).
Пример:
00000001 00000010 00000011 00000100
Каждый байт представляет один компонент цвета:
- 1-й байт: альфа-значение (00000001 в примере), которое соответствует непрозрачности
- 2-й байт: красное значение (00000010 в примере)
- 3-й байт: зеленое значение (00000011 в примере)
- 4-й байт: синее значение (00000100 в примере)
0xff и 0xffffff символы
0xff представляет шестнадцатеричное значение FF, которое равно целому числу 255. Его двоичное представление:
00000000 00000000 00000000 11111111
Аналогично 0xffffff представляется:
00000000 11111111 11111111 11111111
Он соответствует цвету белого (красный, зеленый и синий равным 255).
& оператор
Бинарный оператор и "&" применяется к двум целым числам i1 и i2 (i1 и i2). Он возвращает целое число со всеми его битами, равными 0, кроме тех, которые равны 1 в i1 и i2.
Например, если мы применим и в моем первом примере и на 0xff, мы получим:
00000000 00000000 00000000 00000100
Как следствие, (& 0xff) позволяет сохранять только значения последнего байта (т.е. значение синей составляющей цвета).
// 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
& 0xff
является поразным И
(image.getRGB(i,j)&0xff)
получает синее значение rgb encoded int, возвращаемое getRGB
частью > b
, проверяет, превышает ли это какой-то порог