Что делает "& 0xff"? - PullRequest
       4

Что делает "& 0xff"?

38 голосов
/ 25 мая 2011

Я пытаюсь понять приведенный ниже код, где 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);
}

Ответы [ 5 ]

44 голосов
/ 25 мая 2011

Это так называемая маска. Дело в том, что вы получаете значение 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 в синем корпусе.

12 голосов
/ 25 мая 2011

The

& 0xFF

получает один из компонентов цвета (красный или синий, я забыл, какой).

Если цветовая маска не выполняется, рассмотрим RGB (0, 127, 0) и порог 63. Вызов getRGB (...) вернет

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

Что явно превышает пороговое значение 63. Но цель состояла в том, чтобы игнорировать два других цветовых канала. Битовая маска получает только младшие 8 бит, с нулем.

The

> b

проверяет, является ли цвет более ярким, чем определенный порог, 'b'.

Если порог превышен, пиксель окрашивается в белый цвет, используя

image.setRGB(i,j,0xffffff)

... в противном случае он окрашен в черный цвет, используя

image.setRGB(i,j,0x000000)

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

5 голосов
/ 03 августа 2016

Представление цвета

Значение 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);
}
4 голосов
/ 25 мая 2011

Это, вероятно, потому что есть некоторое преобразование в или из ARGB. Это действительно хороший пост в блоге о том, почему нужно выполнять побитовые операции с цветами.

0 голосов
/ 25 мая 2011

& 0xff - побитовое И

(image.getRGB(i,j)&0xff) получает синее значение rgb в кодировке int, возвращаемое getRGB проверкой части > b, превышает ли оно какое-либо пороговое значение

...