Подтвердить что ты не робот

Что делает "& 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);
}
4b9b3361

Ответ 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)

Таким образом, это преобразование в черно-белое на основе простого пиксельно-пиксельного порога на одном цветовом канале.

Ответ 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, проверяет, превышает ли это какой-то порог