Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Подбор контрастного цвета / 15 сообщений из 15, страница 1 из 1
21.04.2020, 19:09
    #39949578
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подбор контрастного цвета
Имеется некий список, в котором пользователь может выбирать цвет выделения различных элементов на свой вкус.

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

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

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

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

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

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

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

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

Если так делать - "вырви глаз" будет. Несколько предустановленных цветов фона дает лучший результат.
...
Рейтинг: 0 / 0
22.04.2020, 05:58
    #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
22.04.2020, 11:46
    #39949924
L1G
L1G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подбор контрастного цвета
учитывайте, что при инвертировании цвета или его отдельных характеристик (H,L,S) средне-серый цвет превратится в средне-серый (контраста не будет)
...
Рейтинг: 0 / 0
22.04.2020, 17:23
    #39950092
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подбор контрастного цвета
alekcvp,

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

А для него вообще контраст существует?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.04.2020, 20:04
    #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
22.04.2020, 21:19
    #39950195
L1G
L1G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подбор контрастного цвета
Dimitry Sibiryakov
А для него вообще контраст существует?..
Целых два: черный и белый.
Если строго, средне-серого нет. RGB(127,127,127) - темнее его, а RGB(128,128,128) - светлее.
Also: RGB(128,127,128) - темнее, а RGB(127,128,127) - светлее.
...
Рейтинг: 0 / 0
23.04.2020, 00:28
    #39950249
Сергей N
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подбор контрастного цвета
Получение яркости контрастного цвета по отношению к основному, в общем, задача тривиальная. Привожу пример для автоматического выбора яркости контрастного цвета с процентным подмешиванием основного цвета, но без подмешивания других оттенков. Существуют и достаточно простые решения для автоматического выбора яркости контрастного цвета, отличного от основного.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Подбор контрастного цвета / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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