Xwab
Форумыnavigate_nextНебольшие вопросы по PHP/MySQL

Осветление или затемнение цвета в php
Сообщения
Fantik

Возник такой вопрос есть исходный цвет и нужно получить либо более светлый тон, либо тёмный. Например есть такой #4296BB а получить примерно такой #95C5DA. Гуглил два дня и ничего толкового для решения своей проблемы не нашёл.

Может быть у кого-то есть формула или функция для таких операций на php буду благодарен. Или же есть другое решение этой проблемы

28 Дек 2012, 10:18
Akdmeh

1, сменить цифры на одну не пытался? Или это немного не то, что тебе нужно?

28 Дек 2012, 10:24
Fantik

Akdmeh, простая замена не выходит, так как не всегда выходит то что нужно. Цвета должны быть одного тона, а простая замена может вывести совершенно другой цвет ((

P.S да цвета скрипту передаются в RGB

28 Дек 2012, 11:47
Aventus

например цвет #55 55 55
попробуй #56 56 56
те. # +1 +1 +1
или # -1 -1 -1
добавлено спустя 1 минуту:
если в цвете есть буквы, считай на калькуляторе в режиме инженерный, в системе hex

28 Дек 2012, 11:50
Анархист

Fantik,ищи политру цветов.

28 Дек 2012, 12:00
Fantik

Aventus, считать должен скрипт а не я на калькуляторе

Анархист, она мне ничего не даст
добавлено спустя 16 минут:
Aventus, да мне уже не раз предлагали прибавить число, но может получится не тот тон, то есть будет два разных цвета, а если маленькое число,то цвета почти не отличаются друг от друга
добавлено спустя 5 часов 13 минут:
В принципе решил свою проблему. RGB конвертируем в HSL формат, затем увеличиваем параметр L, который отвечает за осветление (в моём случае на 45%). Обратно конвертируем в RGB и всё ОК ))

28 Дек 2012, 17:34
TOOZ

Палитру цветов в БД например залить. Потом запросом получать ID текущего, и уже +1 или -1 к ID'у для оттенка запросом выбирать цвет. Но это жуть способ.

28 Дек 2012, 19:48
Fantik

TOOZ, да всё работает уже выше изложенным способом. Если надо могу функции сюда выложить, мб кому пригодится

28 Дек 2012, 20:49
Akdmeh

8, выложи, интересно ведь.

28 Дек 2012, 22:20
Fantik

Собственно набор функций для конвертации 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% осветления можете экспериментировать. Конечно не на всех цветах выходит то, что хотелось бы.

29 Дек 2012, 6:33
Ответить на тему