powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Подбор контрастного цвета
15 сообщений из 15, страница 1 из 1
Подбор контрастного цвета
    #39949578
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется некий список, в котором пользователь может выбирать цвет выделения различных элементов на свой вкус.

Вопрос: есть ли какой-нибудь простой способ подобрать к выбранному цвету другой, контрастный, чтобы текст этого цвета легко и приятно читался на выбранном фоне?
Заставлять выбирать оба цвета не хочу, т.к. это излишне.
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39949596
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,
Можно использовать значения подобранные на основе цветового круга .
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39949601
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) получить значение яркости цвета (как вариант: 0.299*R + 0.587*G + 0.114*B)
если яркость < половинной (128) - берем белый как контрастный фон (вариант - желтый и т.п.)
иначе берем черный как контрастный фон (вариант - темно-синий и т.п.)

2) 10970964
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39949643
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L1G,

1. Ага, вот об это думал, но проблема в том, что в дельфи некоторые цвета идут как системные, а не в RGB значениях.
2. Не работает, даёт ужасные сочетания.
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39949644
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Den_Z_
alekcvp,
Можно использовать значения подобранные на основе цветового круга .

Интересная штука, спасибо. Но слишком заморочено для моей задачи, хотя потом надо будет поковырять.
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39949724
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpпроблема в том, что в дельфи некоторые цвета идут как системные, а не в RGB значениях.

И переводятся в RGB вызовом одной функции.

alekcvpслишком заморочено

Пара умножений нынче "слишком заморочено". Ню-ню... Всего-то перейти в пространство HSV,
повернуть на 180 и вернуть обратно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39949733
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp

Вопрос: есть ли какой-нибудь простой способ подобрать к выбранному цвету другой, контрастный, чтобы текст этого цвета легко и приятно читался на выбранном фоне?
Да.
Для любого цвета контрастный будет находится в одной из вершин цветового куба.
Просто считай евклидово расстояние для всех 8-ми и бери максимальное.
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39949750
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

Если так делать - "вырви глаз" будет. Несколько предустановленных цветов фона дает лучший результат.
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39949842
Ученик_333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поменять яркость контрастность цвета:
Код: pascal
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.
function ChangeBC(RGB1: TColor;
 Percent_Bright,Max_Percent_Bright,
 Percent_Contrast,Max_Percent_Contrast: extended):TColor; // Поменять яркость, контрастность
var
Lc, LcR, LcG, LcB, w, h, numofcolorXY: integer ;
R, G, B, RGBmax, RGBmin, Bright, Contrast: extended;
begin
 showmessage('Прибавить к яркости: '+floattostr(Percent_Bright)
 +#13#10+'Прибавить к контрастности: '+floattostr(Percent_Contrast));

  R := GetRValue(RGB1);
  G := GetGValue(RGB1);
  B := GetBValue(RGB1);

// Percent_Bright = на сколько изменить яркость в процентах от "-Max_Percent_Bright" до "Max_Percent_Bright", где 0 оставляет яркость неизменной
// Percent_Contrast = на сколько изменить контрастность в процентах от "-Max_Percent_Contrast" до "Max_Percent_Contrast", где 0 оставляет контрастность неизменной
// 255 - максимальное значение для = Max_Percent_Bright и Max_Percent_Contrast

// Цвет "color" в формате от 0 до 1,  (R,G,B)/255
R := R /255;
G := G /255;
B := B /255;

if (Percent_Bright < 0) then
 Lc := -1 // -1 = уменьшить яркость
else Lc := 0; // 0 = увеличить яркость

// Поменять яркость ////////////////////////////////////////////////////
R := Abs(((((1 + Lc) + R * -(Lc * 2 + 1)) * Abs(Percent_Bright)) / Max_Percent_Bright) - R * -(Lc * 2 + 1));
G := Abs(((((1 + Lc) + G * -(Lc * 2 + 1)) * Abs(Percent_Bright)) / Max_Percent_Bright) - G * -(Lc * 2 + 1));
B := Abs(((((1 + Lc) + B * -(Lc * 2 + 1)) * Abs(Percent_Bright)) / Max_Percent_Bright) - B * -(Lc * 2 + 1));

// Поменять контрастность ////////////////////////////////////////////////////
// Максимальное и минимальное значение из трех чисел
RGBmax := (((((R + G) / 2) + (Abs(R - G) / 2)) + B) / 2) + (Abs((((R + G) / 2) + (Abs(R - G) / 2)) - B) / 2);
RGBmin := (((((R + G) / 2) - (Abs(R - G) / 2)) + B) / 2) - (Abs((((R + G) / 2) - (Abs(R - G) / 2)) - B) / 2);

Bright := (RGBmax + RGBmin) / 2; // Яркость от 0 до 255 (или от 0 до 1)
//Contrast := (RGBmax-RGBmin)/2; // Контрастность от 0 до 127.5 (или от 0 до 0.5)

// Условие, уменьшать или увеличивать переменную
LcR := (Ceil((R - Bright) / 2) * -2) + 1; // 1=Если "R" меньше "Bright", -1=если больше
LcG := (Ceil((G - Bright) / 2) * -2) + 1; // 1=Если "G" меньше "Bright", -1=если больше
LcB := (Ceil((B - Bright) / 2) * -2) + 1; // 1=Если "B" меньше "Bright", -1=если больше

R := Abs((((Bright * LcR - R * LcR) * Percent_Contrast) / Max_Percent_Contrast) + R * LcR);
G := Abs((((Bright * LcG - G * LcG) * Percent_Contrast) / Max_Percent_Contrast) + G * LcG);
B := Abs((((Bright * LcB - B * LcB) * Percent_Contrast) / Max_Percent_Contrast) + B * LcB);

if (R>1) then R := 1;
if (G>1) then G := 1;
if (B>1) then B := 1;

ChangeBC := RGB(Round(R*255),Round(G*255),Round(B*255));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Color1: TColor;
begin
 Color1 := RGB(255,8,14);
 Form1.Color := Color1;
 Form1.Color := ChangeBC(Color1, 50, 100, 60, 100);
end;


Если нужно менять оттенок, то проще это делать через HSL или HSV.
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39949924
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
учитывайте, что при инвертировании цвета или его отдельных характеристик (H,L,S) средне-серый цвет превратится в средне-серый (контраста не будет)
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39950092
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

может, тебе это надо?
https://cobalt747.blogspot.com/2020/04/blog-post.html
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39950126
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L1Gсредне-серый цвет превратится в средне-серый

А для него вообще контраст существует?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39950167
swame2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

Не надо пытаться делать это по формулам. Сделать массив - табличку соответствия фонового цвета и цвета шрифта, ну или какое направление преобразования нужно. На основе например таки примеров как здесь- руками.

https://www.bdblogov.ru/2014/05/aspick-compatibility-background-color.html

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

http://colormind.io/template/material-dashboard/

Для кодирования цветов советую константы из модуля
Vcl.Graphics, соотвтевующие Безопасная 216 цветовой палитре Netscape. Тут же есть оптимальные цвета шрифта.

https://ru.wikipedia.org/wiki/Цвета_HTML

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

Если хочется реального сервиса для пользователя, лучше предлагать поменять не отдельные цвета, а сразу сочетаемые палитры, какие предлагаются на ресурсах.
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39950195
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А для него вообще контраст существует?..
Целых два: черный и белый.
Если строго, средне-серого нет. RGB(127,127,127) - темнее его, а RGB(128,128,128) - светлее.
Also: RGB(128,127,128) - темнее, а RGB(127,128,127) - светлее.
...
Рейтинг: 0 / 0
Подбор контрастного цвета
    #39950249
Сергей N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получение яркости контрастного цвета по отношению к основному, в общем, задача тривиальная. Привожу пример для автоматического выбора яркости контрастного цвета с процентным подмешиванием основного цвета, но без подмешивания других оттенков. Существуют и достаточно простые решения для автоматического выбора яркости контрастного цвета, отличного от основного.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Подбор контрастного цвета
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]