Возник такой вопрос есть исходный цвет и нужно получить либо более светлый тон, либо тёмный. Например есть такой #4296BB а получить примерно такой #95C5DA. Гуглил два дня и ничего толкового для решения своей проблемы не нашёл.
Может быть у кого-то есть формула или функция для таких операций на php буду благодарен. Или же есть другое решение этой проблемы
1, сменить цифры на одну не пытался? Или это немного не то, что тебе нужно?
28 Дек 2012, 10:24Akdmeh, простая замена не выходит, так как не всегда выходит то что нужно. Цвета должны быть одного тона, а простая замена может вывести совершенно другой цвет ((
P.S да цвета скрипту передаются в RGB
например цвет #55 55 55
попробуй #56 56 56
те. # +1 +1 +1
или # -1 -1 -1
добавлено спустя 1 минуту:
если в цвете есть буквы, считай на калькуляторе в режиме инженерный, в системе hex
Aventus, считать должен скрипт а не я на калькуляторе
Анархист, она мне ничего не даст
добавлено спустя 16 минут:
Aventus, да мне уже не раз предлагали прибавить число, но может получится не тот тон, то есть будет два разных цвета, а если маленькое число,то цвета почти не отличаются друг от друга
добавлено спустя 5 часов 13 минут:
В принципе решил свою проблему. RGB конвертируем в HSL формат, затем увеличиваем параметр L, который отвечает за осветление (в моём случае на 45%). Обратно конвертируем в RGB и всё ОК ))
Палитру цветов в БД например залить. Потом запросом получать ID текущего, и уже +1 или -1 к ID'у для оттенка запросом выбирать цвет. Но это жуть способ.
28 Дек 2012, 19:48TOOZ, да всё работает уже выше изложенным способом. Если надо могу функции сюда выложить, мб кому пригодится
28 Дек 2012, 20:49Собственно набор функций для конвертации RGB в HSL и обратно:
[php:1:bf80c7017c]function RBGtoHSL ( $R, $G, $B )
{
$var_R = ( $R / 255 );
$var_G = ( $G / 255 );
$var_B = ( $B / 255 );
$var_Min = min( $var_R, $var_G, $var_B )
$var_Max = max( $var_R, $var_G, $var_B )
$del_Max = $var_Max - $var_Min
$L = ( $var_Max + $var_Min ) / 2;
if ( $del_Max == 0 )
{
$H = 0
$S = 0
}
else
{
if ( $L < 0.5 )
{
$S = $del_Max / ( $var_Max + $var_Min );
}
else
{
$S = $del_Max / ( 2 - $var_Max - $var_Min );
}
$del_R = ( ( ( $var_Max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
$del_G = ( ( ( $var_Max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
$del_B = ( ( ( $var_Max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
if ( $var_R == $var_Max )
{
$H = $del_B - $del_G;
}
else if ( $var_G == $var_Max )
{
$H = ( 1 / 3 ) + $del_R - $del_B;
}
else if ( $var_B == $var_Max )
{
$H = ( 2 / 3 ) + $del_G - $del_R;
}
if ( $H < 0 )
{
$H += 1;
}
if ( $H > 1 )
{
$H -= 1
}
}
return array( $H, $S, $L );
}
function HuetoRGB( $v1, $v2, $vH )
{
if ( $vH < 0 )
{
$vH += 1;
}
if ( $vH > 1 )
{
$vH -= 1;
}
if ( ( 6 * $vH ) < 1 )
{
return ( $v1 + ( $v2 - $v1 ) * 6 * $vH );
}
if ( ( 2 * $vH ) < 1 )
{
return ( $v2 );
}
if ( ( 3 * $vH ) < 2 )
{
return ( $v1 + ( $v2 - $v1 ) * ( ( 2 / 3 ) - $vH ) * 6 );
}
return ( $v1 )
}
function HSLtoRGB ( $H, $S, $L )
{
if ( $S == 0 )
{
$R = $L * 255;
$G = $L * 255;
$B = $L * 255;
}
else
{
if ( $L < 0.5 )
{
$var_2 = $L * ( 1 + $S );
}
else
{
$var_2 = ( $L + $S ) - ( $S * $L );
}
$var_1 = 2 * $L - $var_2;
$R = 255 * HuetoRGB( $var_1, $var_2, $H + ( 1 / 3 ) );
$G = 255 * HuetoRGB( $var_1, $var_2, $H );
$B = 255 * HuetoRGB( $var_1, $var_2, $H - ( 1 / 3 ) );
}
return array( $R, $G, $B );
}
[/php:1:bf80c7017c]
добавлено спустя 6 минут:
Для тех, кто в танке работает примерно так:
[php:1:bf80c7017c] $rgb = explode('.', $rgb);
$HSL = RBGtoHSL($rgb[0],$rgb[1],$rgb[2]);
$ColorLight = ($HSL[2]*0.4)+$HSL[2];
$RGBLight = HSLtoRGB($HSL[0], $HSL[1], $ColorLight);
ceil($RGBLight[0]), ceil($RGBLight[1]), ceil($RGBLight[2]) [/php:1:bf80c7017c]
добавлено спустя 2 минуты:
Цифра 0,4 это 40% осветления можете экспериментировать. Конечно не на всех цветах выходит то, что хотелось бы.