С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400

Генерация случайного цвета PHP контрастного фону

07.02.2020, 12:41. Показов 2819. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!
В этой теме взял код генерации случайного цвета, но проблема в том, что если фон совпадает с цветом, то получается беда)

PHP
1
2
3
4
function random_html_color()
    {
        return sprintf( '#%02X%02X%02X', rand(0, 255), rand(0, 255), rand(0, 255) );
    }
Как бы придумать чтобы для случайного цвета фона получать контрасные случайные цвета?
Для примера возьмем белый фон #ffffff
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2020, 12:41
Ответы с готовыми решениями:

Генерация случайного цвета PHP
Здравствуйте, уважаемые форумчане, помогите с вопросом, я не сильно разбираюсь в PHP, но жду от Вас небольшой помощи. Есть задача, написать...

Генерация случайного цвета
Здравствуйте, уважаемые форумчане, помогите с вопросом, я не сильно разбираюсь в PHP, но жду от Вас небольшой помощи. Есть задача, написать...

Генерация случайного значения
Помогите, мне нужно, чтобы php генерировал случайное значение. Требование- длина 40 символов, может состоять из любых цифр и букв англ...

16
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,844
07.02.2020, 13:05
Каким будет контраснтый фон для #ffffff ? Как это выразить математически? Наверное, хотябы один из RGB цветов должен быть дальше от ff на nn-e растояние.
1
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
07.02.2020, 13:28  [ТС]
Вот о том и думаю) Как посчитать, в браузерах в режиме разработчика когда с цветами балуешься он показывает коэффициент контрастности. Думал мож кто сталкивался в курсе формулы какой?

Добавлено через 1 минуту
Цитата Сообщение от crautcher Посмотреть сообщение
Каким будет контраснтый фон для #ffffff ?
Абсолютно контрастный будет #000000 ^_^

Добавлено через 2 минуты
Цитата Сообщение от crautcher Посмотреть сообщение
Наверное, хотябы один из RGB цветов должен быть дальше от ff на nn-e растояние
Т.е. должно работать, к примеру:
PHP
1
2
3
4
function random_html_color()
    {
        return sprintf( '#00%02X%02X', rand(0, 255), rand(0, 255) );
    }
?
0
 Аватар для anamnado
23 / 30 / 4
Регистрация: 08.12.2019
Сообщений: 221
07.02.2020, 14:21
только создавать таблицы
если фон такого то цвета то выбираем из указанных цветовых таблиц а некоторые закрыты
таблицы подобрать по сочетаниям
количества от нужного качества зависит.. - минимум 16.. максимум 256 хватит.. (количество цветов)

- например фон синий
ищем к нему в таблицах - желтых оттенков, серых...

- красный не сочитается с синим не ищем
- зеленый не сочетается

полный рендом не годится конечно
ну а как вы еще хотите........

то есть получаем данные в формате
{blue: [yelou, white, ....]}
{white: [green, red, blue, yelou, ..... ]}

и так далее

Добавлено через 1 минуту
и тогда ранд будет иной
rand(145, 160) || rand(56, 123),
|| - или
0
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
07.02.2020, 14:41  [ТС]
Вот про браузер говорил коэффициент контрастности, хотелось бы конечно математикой обойтись, а не таблицы создавать, если конечно ничего не выйдет, то придется таблицы, благо пока под 2 цвета фона нужно...
https://prnt.sc/qywtax
0
 Аватар для anamnado
23 / 30 / 4
Регистрация: 08.12.2019
Сообщений: 221
07.02.2020, 14:44
[комментарий]

изобретаете теже яйца вид сбоку при трудоекости + 1534% без особой на то нужды...
[я помочь не могу.. это я уже не умею]
1
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
07.02.2020, 15:01  [ТС]
Цитата Сообщение от anamnado Посмотреть сообщение
при трудоекости + 1534%
Ну такое) Или ручками таблицы создавать заполнять искать цвета, или формулу подправил в одном месте и готово
Спасибо за помощь) Всё же вариант с таблицами имеет право на жизнь)
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
07.02.2020, 15:24
можно так попробовать:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function getRandomPalette()
{
    $color = [rand(0, 255), rand(0, 255), rand(0, 255)];
    $background = [];
    for ($i = 0; $i < 3; $i++) {
        if ($color[$i] < 128) {
            $background[$i] = 255;
        } else {
            $background[$i] = 0;
        }
    }
    // возвращает массив, где первый элемент фон, второй цвет элемента
    return [rgbToHex($background, $color)];
}
function rgbToHex($color) {
     $rgb = dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
     return [rgbToHex($background), rgbToHex($color)];
}
Добавлено через 7 минут
ой, ошибся
13 строчка должна быть так:
PHP
1
return [rgbToHex($background), rgbToHex($color)];
17 - так:
PHP
1
return("#".substr("000000".$rgb, -6));
1
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
07.02.2020, 15:56  [ТС]
Интересная математика)
Нужно переделать с передачей цвета фона в функцию, немного изменить логику, "делать рандом пока не"... В общем вечером попробую изменить.
Только че то вот так с ходу не понимаю 17 строчку (переделанную).
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
07.02.2020, 16:09
Цитата Сообщение от vino0s Посмотреть сообщение
Только че то вот так с ходу не понимаю 17 строчку (переделанную).
возвращает код цвета в правильном шестнадцатеричном формате. dechex часто возвращает неправильный вид, например #ahh4, ну неполное число цифр, не 6
в общем в функции rgbToHex первая строчка отсюда
вторая там же
0
07.02.2020, 17:32

Не по теме:


Цитата Сообщение от vino0s Посмотреть сообщение
Абсолютно контрастный будет #000000 ^_^
а для #888888 абсолютно контрастным какой будет? )

0
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
07.02.2020, 19:17  [ТС]
Нашел статью
https://www.w3.org/TR/2008/REC... minancedef
относительная яркость
относительная яркость любой точки в цветовом пространстве, нормализованная к 0 для самого темного черного и 1 для самого светлого белого

Примечание 1: Для цветового пространства sRGB относительная яркость цвета определяется как L = 0.2126 * R + 0.7152 * G + 0.0722 * B, где R, G и B определяются как:

если R sRGB <= 0.03928 то R = R sRGB /12.92 иначе R = ((R sRGB +0.055) / 1.055) ^ 2.4

если G sRGB <= 0.03928, то G = G sRGB / 12.92 else G = ((G sRGB +0.055) / 1.055) ^ 2.4

если B sRGB <= 0.03928 то B = B sRGB / 12.92 иначе B = ((B sRGB +0.055) / 1.055) ^ 2.4

а R sRGB, G sRGB и B sRGB определяются как:

R sRGB = R 8bit / 255

G sRGB = G 8bit / 255

B sRGB = B 8bit / 255

Всё понятно кроме R 8bit, G 8bit, B 8bit...

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function contrast_color($value='#0e1a1f')
    {
        foreach (str_split(substr($value, 1), 2) as $key => $value2) {
            $hc = hexdec($value2);
            $colorback[] = $hc;
        }
 
        $Rs = $colorback[0]/255;
        $Gs = $colorback[1]/255;
        $Bs = $colorback[2]/255;
 
        if ($Rs <= 0.03928) {
            $R = $Rs/12.92;
        } else {
            $R = pow (($Rs + 0.055)/1.055, 2.4);
        }
 
        if ($Gs <= 0.03928) {
            $G = $Gs/12.92;
        } else {
            $G = pow (($Gs + 0.055)/1.055, 2.4);
        }
 
        if ($Bs <= 0.03928) {
            $B = $Bs/12.92;
        } else {
            $B = pow (($Bs + 0.055)/1.055, 2.4);
        }
 
        echo "RGB $R $G $B<br>";
 
        $ok = false;
        while (!$ok) {
            $color = [rand(0, 255), rand(0, 255), rand(0, 255)];
            $ok = false;
            if ( ($color[0] < $R + 30) && ($color[0] > $R - 30) && ($color[1] < $G + 30) && ($color[1] > $G - 30)  && ($color[2] < $B + 30) && ($color[2] > $B - 30) ) {
                $ok = true;
            }
        }
 
        print_r($color);
        print_r($colorback);
 
        /*return [rgbToHex($colorback), rgbToHex($color)];*/
    }
Что то не так

Добавлено через 7 минут
Так это я вычислил для фона
PHP
1
2
3
echo "RGB $R $G $B<br>";
$L = $R + $G + $B;
echo "L $L<br>";
Теперь мне надо наверно для текста и чтоб разница между ними была 5.5 как минимум

Добавлено через 6 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
function contrast_color($value='#0e1a1f')
    {
        foreach (str_split(substr($value, 1), 2) as $key => $value2) {
            $hc = hexdec($value2);
            $colorback[] = $hc;
        }
 
        $Rs = $colorback[0]/255;
        $Gs = $colorback[1]/255;
        $Bs = $colorback[2]/255;
 
        if ($Rs <= 0.03928) {
            $R = $Rs/12.92;
        } else {
            $R = pow (($Rs + 0.055)/1.055, 2.4);
        }
 
        if ($Gs <= 0.03928) {
            $G = $Gs/12.92;
        } else {
            $G = pow (($Gs + 0.055)/1.055, 2.4);
        }
 
        if ($Bs <= 0.03928) {
            $B = $Bs/12.92;
        } else {
            $B = pow (($Bs + 0.055)/1.055, 2.4);
        }
 
        echo "RGB $R $G $B<br>";
        $L = $R + $G + $B;
        echo "L $L<br>";
 
        $ok = false;
        while (!$ok) {
            $color = [rand(0, 255), rand(0, 255), rand(0, 255)];
            $ok = false;
 
            $Rs2 = $color[0]/255;
            $Gs2 = $color[1]/255;
            $Bs2 = $color[2]/255;
 
            if ($Rs2 <= 0.03928) {
                $R2 = $Rs2/12.92;
            } else {
                $R2 = pow (($Rs2 + 0.055)/1.055, 2.4);
            }
 
            if ($Gs2 <= 0.03928) {
                $G2 = $Gs2/12.92;
            } else {
                $G2 = pow (($Gs2 + 0.055)/1.055, 2.4);
            }
 
            if ($Bs2 <= 0.03928) {
                $B2 = $Bs2/12.92;
            } else {
                $B2 = pow (($Bs2 + 0.055)/1.055, 2.4);
            }
 
            echo "RGB $R2 $G2 $B2<br>";
            $L2 = $R2 + $G2 + $B2;
            echo "L2 $L2<br>";
 
            /*if ( ($color[0] < $R + 30) && ($color[0] > $R - 30) && ($color[1] < $G + 30) && ($color[1] > $G - 30)  && ($color[2] < $B + 30) && ($color[2] > $B - 30) ) {
                $ok = true;
            }*/
            if (abs($L - $L2) > 0.5) {
                $ok = true;
            }
        }
 
        print_r($color);
        print_r($colorback);
 
        /*return [rgbToHex($colorback), rgbToHex($color)];*/
    }
Как мне вернуть из функции 2 значения? return ошибка (закоменчено)

Добавлено через 31 секунду
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
function contrast_color($value='#0e1a1f')
    {
        foreach (str_split(substr($value, 1), 2) as $key => $value2) {
            $hc = hexdec($value2);
            $colorback[] = $hc;
        }
 
        $Rs = $colorback[0]/255;
        $Gs = $colorback[1]/255;
        $Bs = $colorback[2]/255;
 
        if ($Rs <= 0.03928) {
            $R = $Rs/12.92;
        } else {
            $R = pow (($Rs + 0.055)/1.055, 2.4);
        }
 
        if ($Gs <= 0.03928) {
            $G = $Gs/12.92;
        } else {
            $G = pow (($Gs + 0.055)/1.055, 2.4);
        }
 
        if ($Bs <= 0.03928) {
            $B = $Bs/12.92;
        } else {
            $B = pow (($Bs + 0.055)/1.055, 2.4);
        }
 
        echo "RGB $R $G $B<br>";
        $L = $R + $G + $B;
        echo "L $L<br>";
 
        $ok = false;
        while (!$ok) {
            $color = [rand(0, 255), rand(0, 255), rand(0, 255)];
            $ok = false;
 
            $Rs2 = $color[0]/255;
            $Gs2 = $color[1]/255;
            $Bs2 = $color[2]/255;
 
            if ($Rs2 <= 0.03928) {
                $R2 = $Rs2/12.92;
            } else {
                $R2 = pow (($Rs2 + 0.055)/1.055, 2.4);
            }
 
            if ($Gs2 <= 0.03928) {
                $G2 = $Gs2/12.92;
            } else {
                $G2 = pow (($Gs2 + 0.055)/1.055, 2.4);
            }
 
            if ($Bs2 <= 0.03928) {
                $B2 = $Bs2/12.92;
            } else {
                $B2 = pow (($Bs2 + 0.055)/1.055, 2.4);
            }
 
            echo "RGB $R2 $G2 $B2<br>";
            $L2 = $R2 + $G2 + $B2;
            echo "L2 $L2<br>";
 
            /*if ( ($color[0] < $R + 30) && ($color[0] > $R - 30) && ($color[1] < $G + 30) && ($color[1] > $G - 30)  && ($color[2] < $B + 30) && ($color[2] > $B - 30) ) {
                $ok = true;
            }*/
            if (abs($L - $L2) > 0.5) {
                $ok = true;
            }
        }
 
        print_r($color);
        print_r($colorback);
 
        /*return [rgbToHex($colorback), rgbToHex($color)];*/
    }
Как мне вернуть из функции 2 значения? return ошибка (закоменчено)

Добавлено через 5 минут
Мозги поплыли сорян)
PHP
1
2
3
4
5
6
function rgbToHex($color) {
        $red = dechex($color[0]); 
        $green = dechex($color[1]);
        $blue = dechex($color[2]);
        return "#" . $red . $green . $blue;
    }
Добавлено через 38 секунд
PHP
1
2
3
4
function rgbToHex($color) {
     $rgb = dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
     return [rgbToHex($background), rgbToHex($color)];
}
Лучше наверно эту

Добавлено через 6 минут
Обобщу
Всем спасибо!
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
function rgbToHex($color) {
        $rgb = dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
        return("#".substr("000000".$rgb, -6));
    }
 
    function contrast_color($value='#0e1a1f')
    {
        foreach (str_split(substr($value, 1), 2) as $key => $value2) {
            $hc = hexdec($value2);
            $colorback[] = $hc;
        }
 
        $Rs = $colorback[0]/255;
        $Gs = $colorback[1]/255;
        $Bs = $colorback[2]/255;
 
        if ($Rs <= 0.03928) {
            $R = $Rs/12.92;
        } else {
            $R = pow (($Rs + 0.055)/1.055, 2.4);
        }
 
        if ($Gs <= 0.03928) {
            $G = $Gs/12.92;
        } else {
            $G = pow (($Gs + 0.055)/1.055, 2.4);
        }
 
        if ($Bs <= 0.03928) {
            $B = $Bs/12.92;
        } else {
            $B = pow (($Bs + 0.055)/1.055, 2.4);
        }
 
        //echo "RGB $R $G $B<br>";
        $L = $R + $G + $B;
        //echo "L $L<br>";
 
        $ok = false;
        while (!$ok) {
            $color = [rand(0, 255), rand(0, 255), rand(0, 255)];
            $ok = false;
 
            $Rs2 = $color[0]/255;
            $Gs2 = $color[1]/255;
            $Bs2 = $color[2]/255;
 
            if ($Rs2 <= 0.03928) {
                $R2 = $Rs2/12.92;
            } else {
                $R2 = pow (($Rs2 + 0.055)/1.055, 2.4);
            }
 
            if ($Gs2 <= 0.03928) {
                $G2 = $Gs2/12.92;
            } else {
                $G2 = pow (($Gs2 + 0.055)/1.055, 2.4);
            }
 
            if ($Bs2 <= 0.03928) {
                $B2 = $Bs2/12.92;
            } else {
                $B2 = pow (($Bs2 + 0.055)/1.055, 2.4);
            }
 
            //echo "RGB $R2 $G2 $B2<br>";
            $L2 = $R2 + $G2 + $B2;
            //echo "L2 $L2<br>";
 
            /*if ( ($color[0] < $R + 30) && ($color[0] > $R - 30) && ($color[1] < $G + 30) && ($color[1] > $G - 30)  && ($color[2] < $B + 30) && ($color[2] > $B - 30) ) {
                $ok = true;
            }*/
            if (abs($L - $L2) > 0.5) {
                $ok = true;
            }
        }
 
        //print_r(rgbToHex($color));
        //print_r(rgbToHex($colorback));
 
 
        return rgbToHex($color);
        //return [rgbToHex($colorback), rgbToHex($color)];
    }
 
    $cc = contrast_color('#ffffff');
    echo "<br>";
    print_r($cc);
1
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
07.02.2020, 19:17
у меня нормально и прежняя rgbToHex работает:
PHP
1
2
3
4
function rgbToHex($color) {
     $rgb = dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
     return("#".substr("000000".$rgb, -6));
 }
выводит следующее:
RGB 0.0043914420374103 0.010329823029627 0.01370208304729
L 0.028423348114327
RGB 0.65837481727945 0.46778379611216 0.70837577989169
L2 1.8345343932833
#0e1a1f, #d4b6db

проблема в том, что для одного background #0e1a1f выводит кучу разных $color при обновлении страницы.
а чего Вы заморачиваетесь, если нужно только, чтобы цвет не сливался с фоном?
0
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
07.02.2020, 19:31  [ТС]
PHP
1
2
3
4
5
function rgbToHex($color) {
        //$rgb = dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
        return sprintf( '#%02X%02X%02X', $color[0], $color[1], $color[2] );
        //return("#".substr("000000".$rgb, -6));
    }
Добавлено через 1 минуту
Цитата Сообщение от vinikon Посмотреть сообщение
а чего Вы заморачиваетесь, если нужно только, чтобы цвет не сливался с фоном?
Нужно несколько от 10 различных цветов текста для пользовательского цвета фона.

Добавлено через 2 минуты
Ну с фоном всё ништяк) Ещё бы они между собой были отличительными на глаз)

Добавлено через 2 минуты
Нужна была цветовая группировка с условием того что в группе может быть элемент принадлежащий другой группе и его следовало отобразить цветом его группы.

Добавлено через 32 секунды
И количество таких групп определяется пользователем и по сути может расти до бесконечности

Добавлено через 1 минуту
Цитата Сообщение от vinikon Посмотреть сообщение
у меня нормально и прежняя rgbToHex работает:
У меня почему то 5 символов вывела вместо 6 для HEX, а мозги уже поплывшие не стал разбираться взял точно работающую с исключением ошибки.
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
07.02.2020, 19:33
Цитата Сообщение от vino0s Посмотреть сообщение
взял точно работающую с исключением ошибки
вариантов много - главное чтоб работало.
желаю успехов
0
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
07.02.2020, 20:05  [ТС]
Всё) Теперь прям как надо)))
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
    function rgbToHex($color) {
        return sprintf( '#%02X%02X%02X', $color[0], $color[1], $color[2] );
    }
 
    function contrast_color($value='#0e1a1f', $colors = [], $koef = 30)
    {
 
        if ( count($colors) > 0 ) {
            foreach ($colors as $key => $value) {
                list($r0, $g0, $b0) = sscanf($value, "#%02x%02x%02x");
                $colorsRGB['r'][] = $r0;
                $colorsRGB['g'][] = $g0;
                $colorsRGB['b'][] = $b0;
            }
        }
 
        foreach (str_split(substr($value, 1), 2) as $key => $value2) {
            $hc = hexdec($value2);
            $colorback[] = $hc;
        }
 
        $Rs = $colorback[0]/255;
        $Gs = $colorback[1]/255;
        $Bs = $colorback[2]/255;
 
        if ($Rs <= 0.03928) {
            $R = $Rs/12.92;
        } else {
            $R = pow (($Rs + 0.055)/1.055, 2.4);
        }
 
        if ($Gs <= 0.03928) {
            $G = $Gs/12.92;
        } else {
            $G = pow (($Gs + 0.055)/1.055, 2.4);
        }
 
        if ($Bs <= 0.03928) {
            $B = $Bs/12.92;
        } else {
            $B = pow (($Bs + 0.055)/1.055, 2.4);
        }
 
        $L = $R + $G + $B;
 
        $ok = false;
        while (!$ok) {
 
            $cok = true;
            while ($cok) {
                $cok = false;
                $color = [rand(0, 255), rand(0, 255), rand(0, 255)];
                for ($i=0; $i < count($colorsRGB['r']); $i++) { 
                    if ( ($color[0] < $colorsRGB['r'][$i] + $koef) && ($color[0] > $colorsRGB['r'][$i] - $koef) && ($color[1] < $colorsRGB['g'][$i] + $koef) && ($color[1] > $colorsRGB['g'][$i] - $koef)  && ($color[2] < $colorsRGB['b'][$i] + $koef) && ($color[2] > $colorsRGB['b'][$i] - $koef) ) {
                        $cok = true;
                    }
                }
            }
            
            $ok = false;
 
            $Rs2 = $color[0]/255;
            $Gs2 = $color[1]/255;
            $Bs2 = $color[2]/255;
 
            if ($Rs2 <= 0.03928) {
                $R2 = $Rs2/12.92;
            } else {
                $R2 = pow (($Rs2 + 0.055)/1.055, 2.4);
            }
 
            if ($Gs2 <= 0.03928) {
                $G2 = $Gs2/12.92;
            } else {
                $G2 = pow (($Gs2 + 0.055)/1.055, 2.4);
            }
 
            if ($Bs2 <= 0.03928) {
                $B2 = $Bs2/12.92;
            } else {
                $B2 = pow (($Bs2 + 0.055)/1.055, 2.4);
            }
 
            $L2 = $R2 + $G2 + $B2;
 
            if (abs($L - $L2) > 0.5) {
                $ok = true;
            }
        }
 
        return rgbToHex($color);
    }
 
$colors = []; //Массив цветов текста
$color='#0e1a1f'; //Цвет фона
$contrast_color = contrast_color($color, $colors, 30); //Получаем сонтрастный цвет для фона и отличающийся на 30 от ранее найденных цветов
$colors[] = $contrast_color; //Добавляем цвет в найденные цвета
Добавлено через 5 минут
PHP
1
2
//Оптимизация коэффициента от количества цветов
$contrast_color = contrast_color($color, $colors, Round(100/(count($colors)+1)));
1
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
07.02.2020, 20:52
надо еще определить $colorsRGB для случая. когда $colors передается пустой, иначе выдает
PHP
1
2
Notice: Undefined variable: colorsRGB in 
Warning: count(): Parameter must be an array or an object that implements Countable in
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2020, 20:52
Помогаю со студенческими работами здесь

Генерация и запись случайного числа
Делаю авторизацию, для безопасности решил сделать так: если пароль верен, то генерируется случайное число и записывается в сессии, кук и...

Генерация случайного числа многомерного ассоциативного массива
Здравствуйте. Помогите пожалуйста. Необходимо вывести два случайных числа из многомерного ассоциативного массива. При этом массив может...

100 фигур случайного цвета
Составить программу, которая выводит на экран 100 фигур случайного цвета Окружность фиксированного радиуса со случайным центром.

Генерация случайного цвета
Здравствуйте! Помогите в среде pascal реализовать генерацию случайного цвета. Возможно ли это сделать? Задание. Сгенерировать новые...

Выбор контрастного цвета
Доброго времени суток, в общем суть такая: есть некий цвет, нужно подобрать для него контрастный цвет. При этом есть доп. условие, выбрав...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru