Задание формулы цвета

У новичков в программировании значительные сложности возникают с заданием формулы цвета —так мы будем называть описывающее его шестнадцатеричное число. Конечно, если необходимый оттенок известен заранее, можно узнать, какая ему формула соответствует, обратившись к панели Color Mixer. Но на практике зачастую возникают задачи динамического формирования формулы цвета.

Для описания одного цвета на современных компьютерах чаще всего выделяется 24 бита. Именно с такими цветами работает Flash-плейер. Первые 8 битов соответствуют синей составляющей, биты с 9 по 16 — зеленой, биты с 17 по 24 — красной. Например, желтый цвет описывается следующим двоичным числом:

111010001110110010001100

Работать с двоичными числами довольно неудобно. Более компактным их аналогом являются числа по основанию 2n. Поэтому, чтобы сократить объем кода и упростить задание величин, двоичным числам ставят в соответствие числа восьмеричные или, чаще, шестнадцатеричные. При этом имеется позиционная однозначность, которая не наблюдалась бы при замене чисел двоичных числами десятичными (например, четырем битам двоичного числа однозначно соответствует один разряд числа шестнадцатеричного).


В шестнадцатеричной форме 24-разрядное двоичное число запишется при помощи 6 цифр от 0 до F. Первые два разряда будут задавать синюю составляющую, третий и четвертый разряды — зеленую, пятый и шестой — красную.

Например:
trace(parseInt("111010001110110010001100",2).toString(16));
// Выводит: е8ес8с

Чем больше величина составляющей, тем больше ее доля в итоговом цвете. Нетрудно догадаться, что интенсивность составляющей может принимать 256 значений (28), изменяясь от 0 до FF. Общее же число оттенков, которые можно описать при помощи 24 битов, равно 16 777 216 (224).

Зная, что формула цвета — это просто число от 0 (0x000000 — черный) до 16 777 215 (0xFFFFFF — белый), можно с легкостью решить важную задачу генерирования случайных оттенков. Для этого достаточно умножить случайное число, возвращенное Math.random(), на верхнюю границу данного интервала, а затем округлить результат:

function randornColor () :Number {
return Math.round(Math.random()*0xFFFFFF);
}
trace(randomColor().toString(16)); // Выводит: 652bab

Четкое понимание того, что формуле цвета соответствует 24-битовое двоичное число, важно также, если задать ее необходимо на основании величины каждой составляющей.


Например, представьте, что цвет объекта в вашем проекте определяется пользователем при помощи трех ползунков, задающих долю красной, синей и зеленой составляющих. После интерпретации положения ползунков необходимо каким-то образом объединить полученные 8-битовые числа в одно 24-битовое. Сделать это можно несколькими способами. В частности, можно перевести значения составляющих в строки, объединить их, а затем трансформировать результат в число:

function RGB(R:Number, G:Number, В:Number):Number {
var res_str:String = R.toString(16)+G.toString(16)+B.toString(16);
return parselnt (res_str, 16);
}
trace(RGB(255, 255, 255).toString(16); // Выводит: ffffff

Приведенный способ объединения составляющих в одну формулу прост для понимания, но не техничен (уж больно много в нем операций). Гораздо лучше упаковать три 8-битовых числа в одно 24-битовое, воспользовавшись побитовыми операторами. Алгоритм следующий:

1. Проводим смешение битов красной составляющей па 16 позиций влево. При этом они займут необходимые положения.

2. Аналогично пункту 1, смещаем биты зеленой составляющей на 8 позиций влево.

3.


Биты синей составляющей смещать не нужно, так как они изначально располагаются на тех же позициях, которые должны им соответствовать в формуле.

4. Проводим операцию побитового ИЛИ над полученными числами. При этом все установлен-
ные биты компонентов отобразятся в результирующем числе.

Описанный алгоритм реализуется следующим кодом:

function RGB(R:Nuraber, G:Nuinber, B:Number):Number {
return R << 16 | G << 8 | B;
}
trace(RGB(255, 255, 255).toString(16); // Выводит: ffffff

Побитовые операторы также могут быть полезны, если необходимо извлечь из формулы цвета значение определенной составляющей. В общем случае для этого необходимо сдвинуть биты формулы так, чтобы первый бит составляющей оказался первым битом всей формулы. Затем необходимо провести операцию побитового И над полученным числом и 0xFF. При этом отсечется та часть числа, которая выходит за пределы первых 8 битов. Для примера приведем код, выделяющий из формулы цвета значение зеленой составляющей:

function G(color:Number):Number {
return (color >> 8) & 0xFF;
}
trace(G(0x00FF00).toString(16)); // Выводит: ff

Чтобы перезаписать значение составляющей в уже имеющемся цвете, необходимо вначале обнулить соответствующие биты.


Для этого нужно провести операцию побитового И между формулой оттенка и 24-битовым числом, у которого не установлены только 8 битов на тех же позициях, которые занимают биты интересующей составляющей, Затем нужно сдвинуть биты нового значения составляющей на положенные для них позиции и провести операцию побитового ИЛИ над полученным числом и формулой. Например, реализуем функцию, заменяющую зеленую составляющую в формуле оттенка:

function newG(color:Number, G:Number):Number {
var col:Number = color & 0xFF00FF;
var g_s:Number = G << 8;
return col | g_s;
}
trace(newG(0xAAFF11, 0x77).toString(16)); // Выводит: АА7711

Как видите, при задании цветовых формул побитовые операторы исключительно полезны. Пожалуй, это единственная область их применения, действительно имеющая определенное значение для практики.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Виртуальные слои клипов
Имена экземпляров клипов
Импорт внешних фильмов и изображений
Клипы как носители кода
Коллизии клипов. Метод hitTest()

Вернуться в раздел: Action Script / 10. Клипы