Я довольно плохо знаком с C# и пытающийся сделать основное программное обеспечение обработки изображений. Я понимаю, что этот отрывок извлекает A, R, G, B от международного значения ARGB "текущего" пикселя WriteableBitmap
for(int i = 0; i < bitmapArray.Length; i++) {
var current = bitmapArray[i];
var alpha = (byte)(current >> 24);
var red = (byte)(current >> 16);
var green = (byte)(current >> 8);
var blue = (byte)(current);
//Some code
}
Что">>" выполнение для преобразования значений?
Кроме того, Если я делаю некоторые вычисления к r, g и b индивидуально, как я преобразовываю их назад в целочисленное значение ARGB для замены исходного пикселя новым?
Заранее спасибо.
Править: спасибо парни, это имеет смысл теперь.
Это оператор двоичного сдвига.
Если у вас есть цвет, определяемый (a, r, g, b), его двоичное представление будет выглядеть следующим образом (при глубине канала 8 бит):
AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
Итак, сдвиньте все это на 24 места и у вас останется альфа-канал
AAAAAAAA
Сдвиньте на 16, и вы получите альфа-канал и красный канал
AAAAAAAARRRRRRRR
Теперь, поскольку он приведен как байт, извлекаются только первые 8 бит
(byte)AAAAAAAARRRRRRRR == RRRRRRRR
Вы также можете получить красный канал, сдвинув 16 разрядов и сложив AND с 11111111 (0xFF)
AAAAAAAARRRRRRRR &
0000000011111111
----------------
00000000RRRRRRRR
Сдвигает биты текущего значения вправо. В случае этого конкретного фрагмента кода, похоже, он извлекает каждый байт информации о цвете из выбранного элемента массива растровых изображений в отдельные байты цвета.
http://msdn.microsoft.com/en-us/library/xt18et0d.aspx
Предполагая, что ваш массив содержит целые числа, чтобы вернуть вычисленное значение обратно в элемент массива, вы должны отменить битовый сдвиг обработать и ИЛИ результаты обратно вместе, например:
int current = (alpha << 24) | (red << 16) | (green << 8) | blue;
В дополнение к ответу Роберта - и чтобы охватить вторую часть вашего вопроса - вы можете объединить разделите компоненты обратно на целое число, используя операторы <<
(сдвиг влево) и |
(побитовое ИЛИ) :
int combined = (alpha << 24) | (red << 16) | (green << 8) | blue;