![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Есть цвет фона, надо вычислить наиболее контрастный цвет для [D7]
Вин2 © (2005-06-12 02:12:00)текста на нём. Как это можно сделать ?
Anatoly Podgoretsky (2005-06-12 15:31:00) [21]Ученик (12.06.05 15:29) [26]
Посмотри как сделана в Дельфи настройка цветов редактора.
Anatoly Podgoretsky (2005-06-12 15:30:00) [22]Если надо просмотреть для всех 16 миллонов цветов, то не представляю, кроме перевода в другую цветовую плоскость.
Ученик (2005-06-12 15:29:00) [23]>Anatoly Podgoretsky © (12.06.05 15:24) [24]
Согласить, как-то не очень, но Ваша идея по формированию цвета стала понятна, спасибо за ответ.
Anatoly Podgoretsky (2005-06-12 15:27:00) [24]Эталон 01-03 _00__01__02__03_
Эталон 04-07 _04__05__06__07_
...
Эталон 60-63 _60__61__62__63_
Anatoly Podgoretsky (2005-06-12 15:24:00) [25]000000
000040
000080
0000С0
//0000FF
004000
...
0040С0
//0040FF
...
C00000
..C0C0
//00FFFF
//FF0000
...
//FFFFFF
for R := 0 TO 3 //4 для FF
for G := 0 TO 3 //4 для FF
for B := 0 TO 3 //4 для FF
формирование TColor 64 или 125 базовых цветов для фона.
Тут общий принцип, с TLabel цвета фона можно статически указать в дизайн тайм.
Ученик (2005-06-12 15:12:00) [26]>Anatoly Podgoretsky © (12.06.05 15:01) [22]
Пример кода, в Вашем варианте вместо вопросиков что написать ?
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
DrawGrid1.Canvas.Brush.Color := ?????;
DrawGrid1.Canvas.Font.Color := ContrastColor(DrawGrid1.Canvas.Brush.Color);
DrawGrid1.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 3, 'Текст')
end;
Anatoly Podgoretsky (2005-06-12 15:01:00) [27]Ученик (12.06.05 14:50) [19]
Ну по вкусу, например с шагом 64 для RGB, получится 4^3 = 64, это вполне достаточно, промежуточные цвета мало отличаются. Речь естественно идет о фоне.
Ученик (2005-06-12 14:57:00) [28]>Просто Джо © (12.06.05 14:54) [20]
А более конкретный ответ есть ?
Просто Джо (2005-06-12 14:54:00) [29]
> [19] Ученик (12.06.05 14:50)
> Вопрос в формировании цвета фона для конкретной ячейки,
> он же, наверно, формируется по какому-то выражению?
Да формула проста: I like it :^)
Ученик (2005-06-12 14:50:00) [30]>Anatoly Podgoretsky © (12.06.05 14:44) [18]
Вопрос в формировании цвета фона для конкретной ячейки, он же, наверно, формируется по какому-то выражению ?
Anatoly Podgoretsky (2005-06-12 14:44:00) [31]Ну например на канве 16*16 квадратиков, или просто такое же количество TLabel - нужно же только для визуализации результата, как например в настройках цветов в среде Дельфи. Меняешь цвет и сразу видишь результат.
Далее два варианта или закладываешь это в виде константы в программу или позволяешь это делать в диалоге пользователю, второй вариант снимает все возражения насчет вкусов.
Ученик (2005-06-12 14:40:00) [32]>Anatoly Podgoretsky © (12.06.05 13:06) [15]
Если не секрет, как Вы закрашиваете табличку 16*16 ?
Alx2 (2005-06-12 13:25:00) [33]Вариант Бориса (MBo)
Имеет минимум в расстоянии при исходном цвете RGB(127,127,112).
Надпись, сделанная цветом ContrastColor(RGB(127,127,112)) на фоне цветом RGB(127,127,112) практически не читается.
Anatoly Podgoretsky (2005-06-12 13:06:00) [34]Результат с таблицей подстановки дает более приемлемые результаты. Для оценки на экране делается тибличка 16*16 или более и глазами смотритс, тут же можно подобрать желаемый цвет для таблицы подстановки. Как я сказал можно такое делать или по одному или по двум старщим битам, если нужно большая селективность. Но как правило уже по одному старшему биту достаточно. Достоинство таблицы именно в гибкости, подстройка под персональный вкус.
Ученик (2005-06-12 12:57:00) [35]>Борыч (12.06.05 12:44) [11]
Попробовал для RGB(128, 128, 192) - получилось не очень, хотя итоговых цветов гораздо больше.
Anatoly Podgoretsky (2005-06-12 12:46:00) [36]Ученик (12.06.05 12:36) [9]
Немного ошибся 0 на 8 элементов. Насчет выбора - выбрать желаемые ручками, дает наиболее приемлемый результат. Но если цвета устраивают, то предложеное Alx2
Ученик (2005-06-12 12:45:00) [37]>Alx2 © (12.06.05 12:42) [10]
Спасибо за Ваши ответы
Борыч (2005-06-12 12:44:00) [38]в большинстве случаев приемлемо:
function ContrastColor(AColor: TColor): TColor;
const TolerSq = 16 * 16;
begin
if Sqr(GetRValue(AColor) - $80) + Sqr(GetGValue(AColor) - $80)
+ Sqr(GetBValue(AColor) - $80) < TolerSq then
Result := (AColor + $7F7F7F) and $FFFFFF
else
Result := AColor xor $FFFFFF;
end;
© MBo
Alx2 (2005-06-12 12:42:00) [39]>Ученик (12.06.05 12:36) [9]
Если в том смысле, что я написал - нет. У куба восемь углов -> 8 экстремальных точек.
Можно попробовать еще другие системы цветовых координат (LaB, LHS,..). Но сколько там будет - не проверял.
Ученик (2005-06-12 12:36:00) [40]>Alx2 © (12.06.05 12:24) [7]
Увеличение вариантов цветов возможно ?
>Anatoly Podgoretsky © (12.06.05 12:26) [8]
Сами значения массива выбираются на свой вкус или они определены ?