Спасибо, я использую ваш код с некоторыми изменениями. Чтобы ответить на ваш вопрос,
Каждый байт в argb - это 32-битное значение, представляющее один пиксель в формате 0xAARRGGBB:
- 8 бит альфа (прозрачность): 0 для прозрачного и 255 для непрозрачного
- 8 бит, красный
- 8 бит, зеленый
- 8 бит синего
Так что 0xFFFFFFFF будет непрозрачным белым.
Код для извлечения значений работает следующим образом:
Чтобы получить значение apha, сдвиньте все на 24 позиции, оставив только первые 8 бит
int alpha = argb[i] >> 24
Чтобы получить красный цвет, сдвиньте вправо на 16, оставив старшие 16 бит. Затем очистите верхние 8 бит с помощью оператора AND. Это оставляет вторые 8 бит
int red = argb[i] >> 16 & 0xFF
Для зеленого цвета сдвинуться на 8 бит и убрать первые 16 бит, оставив третьи 8 бит
int green = argb[i] >> 8 & 0xFF
И, наконец, для синего, просто вычеркните верхние 24 бита
int blue = argb[i] & 0xFF;
На этом этапе вы можете вносить изменения в альфа, красный, зеленый и синий значения. Я использую
int grey = ( red + green + blue ) / 3;
red = grey;
green = grey;
red = grey;
Чтобы получить версию растрового изображения в оттенках серого.
Наконец, чтобы создать новое значение, переместите каждую часть в правильное место и наложите их (что в данном случае совпадает с добавлением их)
int newval = (alpha << 24) | (red << 16) | (green << 8) | blue;
Затем установите argb[i] = newval
для замены пикселя.