Кто-нибудь знает, как создать два новых цвета (свет и тень) на основе одного цвета в ActionScript 3? Итак, если у меня есть красный (0xFF0000), я также получу светло-красный и темно-красный?
Понятия не имею. Спасибо!
Чтобы получить Выделять (легкость), вы увеличиваете каждый R, G и B одинаково на одинаковую величину (с максимумом на 255
или 0xFF
). В вашем случае красный уже находится на максимуме, поэтому увеличьте и зеленый, и синий на одинаковую величину (например сделайте += 128
на каждом из этих каналов).
Чтобы получить Тень (темнота), вы уменьшаете каждый R, G и B одинаково на одинаковую величину (с минимумом в 0
или 0x00
). В вашем случае и зеленый, и синий уже находятся на минимуме, поэтому просто уменьшите только красный на величину Икс (например сделайте -= 128
на красном канале).
Короче:
Введите = 0xFF0000
... затем Подсветка = 0xFF8080
и Тень = 0x800000
.
Обновлять:
В комментариях было сделано хорошее замечание о случаях выделения/тени других цветов (или оттенков). Если мы согласимся с тем, что «светлее» означает добавление большего количества белого, а «темнее» означает добавление большего количества черного, то, возможно, вам может помочь линейная интерполяция (в основном сделайте градиент входного цвета, затухающий к черному или к белому, и выберите предпочитаемый более темный/светлый цвет вдоль эти пути от А до Б...
PS: с помощью интерполяции у вас будет возможность смешивать различные оттенки и оттенки светлоты/темноты. Можете смешать от ярко-красного к более темному красновато-фиолетовому (вместо черного) для получения более «сладких» оттенков, а у зелени могут быть желтые блики (вместо белого). Синий зависит от вас.
пример использования:
var newColour :uint = 0;
newColour = blendRGB_AS3 (0xFF0000, 0xFFFFFF, 0.5) //# get 50% white added
newColour = blendRGB_AS3 (0xFF0000, 0x000000, 0.5) //# get 50% black added
Пример функции:
(примечание: (temp_int >> 0)
используется здесь как быстрый Math.Floor
для любых дробных результатов)
//# function inputs: src_C, dest_C, stopPoint ... where:
//# src_C = source / start colour A (as 0xRGB)
//# dest_C = destination / end colour B (as 0xRGB)
//# stopPoint = A-to-B stopping point (as ranging from 0.0 to 1.0)
function blendRGB_AS3 (src_C, dest_C, stopPoint ) :uint
{
//# using Unsigned INTegers since no need of the minus ( - ) sign.
var temp_int :uint = 0; var res_C :uint = 0;
var src_R :uint = (src_C >> 16 & 0xFF);
var src_G :uint = (src_C >> 8 & 0xFF);
var src_B :uint = (src_C >> 0 & 0xFF);
var dst_R :uint = (dest_C >> 16 & 0xFF);
var dst_G :uint = (dest_C >> 8 & 0xFF);
var dst_B :uint = (dest_C >> 0 & 0xFF);
//# Now for each R, G, B Channel...
//# calculate the mid-point value then merge that into output of "res_C"
//# for Red
temp_int = src_R + stopPoint * (dst_R - src_R);
res_C = ( (temp_int >> 0) << 16);
//# for Green
temp_int = src_G + stopPoint * (dst_G - src_G);
res_C |= ( (temp_int >> 0) << 8);
//# for Blue
temp_int = src_B + stopPoint * (dst_B - src_B);
res_C |= ( (temp_int >> 0) << 0);
return res_C; //# gives: example 0xFF0000 if red
}
Это хорошо работает с чистым RGB, но не со смесью. Допустим, введено значение 0xFF8000, освещение даст FFFF80 (светло-желтый), а тень даст 0x800000 (темно-красный).
Короче говоря, вам нужно преобразовать цвет в HSL, изменить яркость/насыщенность, а затем преобразовать обратно в RGB. Все рецепты доступны через поиск.