Метод getRGB(int x, int y)
всегда возвращает int
пиксель в цветовой модели TYPE_INT_ARGB
.Чтобы вручную извлечь значения красного, зеленого, синего и альфа-канала для пикселя, вы можете сделать это:
int pixel = image.getRGB(1, 1);
int a = (pixel >> 24) & 0xFF;
int r = (pixel >> 16) & 0xFF;
int g = (pixel >> 8) & 0xFF;
int b = pixel & 0xFF;
или использовать для удобства конструктор Color(int rgba, boolean hasalpha)
(за счет производительности).После того, как вы изменили значения красного, зеленого, синего и альфа (в диапазоне от 0 до 255), вы можете снова объединить их в int
для установки пикселей:
int newPixel = (a << 24) | (r << 16) | (g << 8) | b;
Использование -7368817пиксель, который вы упомянули с помощью этого кода, альфа равна 255 (поэтому прозрачности нет), а значения красного, зеленого и синего равны 143. Поскольку вы работаете с оттенками серого, вы можете просто выбрать любой из красного, зеленого или синего, чтобы получить серый цвет.значение.Однако при настройке пикселя вы должны установить все три для поддержания градаций серого, так как это RGB.Вы можете кратко обозначить его примерно так:
int pixel = image.getRGB(1, 1);
// extract your gray value from blue, assume red and green are same
int gray = pixel & 0xFF;
// this method does your manipulation on the gray value, 0 to 255
gray = manipulate(gray);
// recombine back into int, preserving the original alpha
int newPixel = (pixel & 0xFF000000) | (gray << 16) | (gray << 8) | gray;
// now you can set your new pixel
image.setRGB(1, 1, nexPixel);
По сути, уловка заключается в использовании int
в качестве вашего неподписанного байта.Просто убедитесь, что вы держите значения от 0 до 255. Все должно работать нормально.