Необходимо из int rgba, в котором содержится цвет в формате rgba вытащить в отдельные переменные все цвета и значение канала альфа

На вход дается int rgba, в котором хранится цвет в формате rgba. Нужно в отдельных методах вытащить по отдельности все цвета и значение параметра альфа. И ровно наоборот, из 4 различных int собрать полностью цвет в rgba.

rgba в памяти

Я понимаю, что нужно это делать через битовые операции, но я не до конца уверен. Мне кажется это должно выглядеть как-то так:

  • Альфа: return (rgba & 0xFF)
  • Синий цвет : return ((rgba & 0xFF00) >> 8
  • Зеленый цвет: return ((rgba & 0xFF0000) >> 16
  • Красный цвет: return ((rgba & 0xFF000000) >> 24

А чтобы собрать rgba обратно:

rgba = 0;
rgba = (red << 24) | (green << 16) | (blue << 8) | (alpha)

Ответы (1 шт):

Автор решения: Alex Rudenko

В целом всё нормально, только для вычисления красного цвета имеет смысл воспользоваться беззнаковым сдвигом >>>:

static int red(int rgba) {
    return (rgba & 0xFF000000) >>> 24;
}

static int red_signed(int rgba) {
    return (rgba & 0xFF000000) >> 24;
}

Сравнение результатов для rgba = 0xFABBCC33;:

System.out.println(Integer.toHexString(rgba) + " -> unsign red: " + Integer.toHexString(red(rgba)));
System.out.println(Integer.toHexString(rgba) + " -> signed red: " + Integer.toHexString(red_signed(rgba)));

Output:

fabbcc33 -> unsign red: fa
fabbcc33 -> signed red: fffffffa
→ Ссылка