Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

Формула инверсия цвета   Найти похожие ветки 

 
Ega23 ©   (2005-01-12 13:45) [0]

Несколько необычный вопрос. Имеется следующая проблема - раскрашиваю TRxDBGrid. В запросе из базы летит строка, типа: FCL:255,FSZ:10,FST:0,BCL:65280,
где FCL - FontColor, FSZ - FontSize, FST - FontStyle, BCL - BackgroundColor.
Так вот. Вся проблема в том, что как только я меняю бэкграунд с белого на любой другой цвет - пропадает Highlight. Нужно его восстановить. Поскольку clHighlight - чистая константа, изменить цвет выделения можно только изменив цвет бэкграунда.
Самый простой вариант -
if Highlight then
 begin
  Background:=clHighlight;
  AFont.Color:=clHighlightText;
 end;

но это не совсем красиво. Допустим, цвет фона сам по себе синий. Тогда этой подсветки не будет видно. Или он, какой-нибудь красный, с которым синий не сочетается (это к примеру, чувство цвета у меня напроч отсутствует).
Собственно вопрос: существует ли формула инверсии цвета? Т.е., к примеру, цвет фона синий - меняем по этой формуле местами биты - получаем чвет выделения на синем - жёлтый.


 
pasha_golub ©   (2005-01-12 13:49) [1]

xor?


 
TUser ©   (2005-01-12 13:50) [2]

Я, когда грид красил, то писал в DrawCell
  if CanFill then
     with Self.Canvas do begin
        if (gdSelected in AState) and (not (gdFocused in AState)) then
           Brush.Color:=Color xor clBlue
           else Brush.Color:=Color;

Здесь clBlue - цвет выделения.


 
Anatoly Podgoretsky ©   (2005-01-12 13:52) [3]

Это не инверсия, а контрастные цвета и/или совместимые цвета, а сама формула инверсии следующая - Color := Color XPR $FFFFFF, но результат по контрастности будет плохой.


 
Игорь Шевченко ©   (2005-01-12 13:52) [4]


> существует ли формула инверсии цвета?


Самый примитивный способ - инвертировать все биты цвета :) Серый останется серым, но в ряде случаев достаточно.

С уважением,


 
Ega23 ©   (2005-01-12 13:53) [5]

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


 
Ega23 ©   (2005-01-12 13:54) [6]

Это не инверсия, а контрастные цвета и/или совместимые цвета,

Ну я это и имел ввиду.


 
pasha_golub ©   (2005-01-12 13:54) [7]

Ega23 ©   (12.01.05 13:53) [5]
Лучше всего на черно-белой паре xor работает. :)

Есть такая фишка, есть... Токо вот где?


 
Anatoly Podgoretsky ©   (2005-01-12 13:56) [8]

TUser ©   (12.01.05 13:50) [2]
цвет выделения не обязательно clBlue. Теперь представь $FFFFFF и фон $7F7F7F


 
wal ©   (2005-01-12 13:57) [9]

>Вот и хотелось посоветоваться - xor на всех цветах нормальные сочетания даёт?
Нет.
10000000 xor 11111111 = 01111111,
а у 10000000 и 01111111 разница совсем не велика, на глаз не заметишь.

С уважением.


 
Anatoly Podgoretsky ©   (2005-01-12 13:57) [10]

Ega23 ©   (12.01.05 13:53) [5]
Нет, смотри [8], результат будет $808080, что по сути равно $7F7F7F


 
Ega23 ©   (2005-01-12 13:59) [11]

цвет выделения не обязательно clBlue.

Цвет выделения описан в Graphics.pas и представляет собой

const
 clHighlight = TColor(COLOR_HIGHLIGHT or $80000000);
 clHighlightText = TColor(COLOR_HIGHLIGHTTEXT or $80000000);


где COLOR_HIGHLIGHT и COLOR_HIGHLIGHTTEXT - цвета элементов текущей цветовой схемы Windows.


 
Ega23 ©   (2005-01-12 14:01) [12]

Нет, смотри [8], результат будет $808080, что по сути равно $7F7F7F

Вот и я о том же. Самое поганое, что заказчик хочет красить данные на свой вкус, иначе забил бы в базу 2 десятка цветов + контрастные к ним.


 
Anatoly Podgoretsky ©   (2005-01-12 14:02) [13]

Ega23 ©   (12.01.05 13:59) [11]
Не надо путать системную палитру и свойство Highloght
Для твоего случая я бы посоветовал замену по сокращенной таблицы цветов. Какой цвет подставлять подобрать экспериментально исходя из сообственных предпочтений.


 
pasha_golub ©   (2005-01-12 14:02) [14]

В таком слуае есть предложение, не просто xor делать. А потом "округлять" (приводить) к ближайшему "грубому" цвету из заранее подготовленной палитры.


 
Anatoly Podgoretsky ©   (2005-01-12 14:03) [15]

pasha_golub ©   (12.01.05 14:02) [14]
Мысль двигается одинаково


 
boriskb ©   (2005-01-12 14:04) [16]

Ega23 ©   (12.01.05 14:01) [12]
Самое поганое, что заказчик хочет красить данные на свой вкус, иначе забил бы в базу 2 десятка цветов + контрастные к ним.


Он что - дальтоник? Он настаивает что цвет может быть абсолютно любым из 32 бит?
Тогда работать сним, убеждать.
IMHO если у него такое странное цветовосприятие - что бы ты не выдумал, он будет придираться.


 
Alx2 ©   (2005-01-12 14:05) [17]

>Ega23 ©   (12.01.05 14:01)
А если попробовать сделать что-то такое:
Имеем цветовой куб (по осям R,G,B соответственно).
Исходный цвет - точка в этом кубе.
И наиболее отличающийся цвет ищем как наиболее удаленную точку на этом кубе?


 
Anatoly Podgoretsky ©   (2005-01-12 14:06) [18]

Alx2 ©   (12.01.05 14:05) [17]
Это удаленная а не совместимая точка, кроме решения по таблице все остальные будут неудовлетворительны. А если таблицу держать в базе, то можно позволить ее и настраивать по вкусу.


 
Alx2 ©   (2005-01-12 14:07) [19]

>Alx2 ©   (12.01.05 14:05) [17]
Вдогонку:
Такая точка будет находиться в вершинах куба. Их всего 8.
Поэтому достаточно перебрать вершины и остановиться на наиболее удаленной


 
Alx2 ©   (2005-01-12 14:09) [20]

>Anatoly Podgoretsky ©   (12.01.05 14:06)
То есть речь идет еще и о приятном цветосочетании?


 
wicked ©   (2005-01-12 14:09) [21]

советую обратить внимание на
http://predskazanie-wunschpunsch.ru/view/4-1104759069/
особенно постинг от Asteroid (идея мне понравилась...)


 
pasha_golub ©   (2005-01-12 14:11) [22]

Alx2 ©   (12.01.05 14:07) [19]
Ого, у тебя идеи. Прикольно, блин.


 
Ega23 ©   (2005-01-12 14:11) [23]

Не надо путать системную палитру и свойство Highloght

Да я их не путаю, просто в дебрях исходников рисования CustomDBGrid"а наткнулся на

if Higlight then
 begin
  Brush.Color:=clHighlight;
  Font.Color:=clHighlightText;


Т.е. общей формулы, насколько я понимаю, нету?
В принципе, можно дать пользователю возможность настройки цыета выделения, это не проблема...


 
Семен Сорокин ©   (2005-01-12 14:15) [24]

вставлю свои 5 копеек :)
а я в свое время вот этим пользовался:

function InvertColor(AColor: TColor): TColor;
begin
Result := RGB(255 - GetRValue(ColorToRGB(AColor)),
              255 - GetGValue(ColorToRGB(AColor)),
              255 - GetBValue(ColorToRGB(AColor)))
end;


 
Ega23 ©   (2005-01-12 14:16) [25]

советую обратить внимание на
http://predskazanie-wunschpunsch.ru/view/4-1104759069/

C := C xor $808080 ?
Сейчас попробую...

2 Alx2 ©   (12.01.05 14:05) [17]

Интересная идея... Т.е. всего 8 цветов...


 
Anatoly Podgoretsky ©   (2005-01-12 14:18) [26]

Семен Сорокин ©   (12.01.05 14:15) [24]
Это аналитическая реализация булевой функции XOR


 
Anatoly Podgoretsky ©   (2005-01-12 14:19) [27]

Ega23 ©   (12.01.05 14:16) [25]
А как же насчет
Допустим, цвет фона сам по себе синий. Тогда этой подсветки не будет видно. Или он, какой-нибудь красный, с которым синий не сочетается (это к примеру, чувство цвета у меня напроч отсутствует).


 
pasha_golub ©   (2005-01-12 14:27) [28]

Значит в развитие идеи Алекса.

Предлагаю, для начала перейти от палитры RGB к палитре HSB (hue;saturation;brightness). А вот уже на ней использовать алгоритм Алекса. По моему скромному, в таком случае мы предотвратим возможность появления красного текста на зеленом фоне, брр-р-р


 
Ega23 ©   (2005-01-12 14:27) [29]

Допустим, цвет фона сам по себе синий. Тогда этой подсветки не будет видно. Или он, какой-нибудь красный, с которым синий не сочетается (это к примеру, чувство цвета у меня напроч отсутствует).

А, это в том случае, если цветовая палитра Windows - стандартная и я ничего не меняю, if Highlight...


 
Ega23 ©   (2005-01-12 14:28) [30]

Предлагаю, для начала перейти от палитры RGB к палитре HSB

У тебя под рукой формулы нет? У меня где-то валялась, но, чую, замучаюсь её искать... :-(


 
Alx2 ©   (2005-01-12 14:29) [31]

>Ega23 ©   (12.01.05 14:28) [30]
А я предлагаю сначала на RGB попробовать :)


 
wicked ©   (2005-01-12 14:30) [32]

хм... попробовал на реальном проекте C := C xor $808080... всё хорошо (нет серого на сером), но на выделенном участке не видно черный текст на белом фоне....
пробуем дальше....


 
Ega23 ©   (2005-01-12 14:31) [33]

2 wicked ©   (12.01.05 14:30) [32]

А ты Font.Color точно так же меняй...


 
TUser ©   (2005-01-12 14:32) [34]


> xor на всех цветах нормальные сочетания даёт?

Меня [2] удвлетворил. Потом работал с этим компонентом, используя много разных цветов - всегда получалось неплохо.


 
boriskb ©   (2005-01-12 14:35) [35]

Ega23 ©

Не знаю, мне кажется, что задача которую ты решаешь имеет чисто академический интерес. А практически будет так: пользователь все равно составит себе табличку и будет из нее выбирать.  Ну не будет он всеми возможными цветами пользоваться, согласись?
Лучше подумать как ему эту табличку удобней предоставить.


 
pasha_golub ©   (2005-01-12 14:38) [36]

boriskb ©   (12.01.05 14:35) [35]
Ну, дык, за то интересно ведь. А вообще юзеру надо обрубить возможность цвет настраивать - пущай об работе думаит. Бугагага


 
wicked ©   (2005-01-12 14:38) [37]

насчет RGB и HLS - начиная с delphi 6 (предполагаю, у меня cbuilder 6) есть модуль graphutil... советую глянуть...

> Ega23 ©   (12.01.05 14:31) [33]
не хоцца, ибо выделение - это участок шкалы, на которой могут быть метки с текстом, рисунки и прочая... лучший способ, который я придумал - это как раз инвертировать выделенную область... а метки как рисовались, так и рисуются....
видать таки вернусь к инвертированию - фон серый на сером и так неплох... ;)


 
boriskb ©   (2005-01-12 14:39) [38]

pasha_golub ©   (12.01.05 14:38) [36]
вообще юзеру надо обрубить возможность цвет настраивать - пущай об работе думаит


:) :) Ну, типа того.


 
wicked ©   (2005-01-12 14:43) [39]

> pasha_golub ©   (12.01.05 14:38) [36]
ну почему же... когда я работал в "большой-конторе", то видел, как многие продвинутые бухгалтера настраивали цвета под себя... жить без того им было скучно...
а поскольку мне медведь не только на ухо наступил, но и в глаз плюнул, то самое лучшее - использовать системные цвета windows... тогда в моих аппликациях и цвета подобраны, и юзер доволен...


 
Ega23 ©   (2005-01-12 14:48) [40]

насчет RGB и HLS - начиная с delphi 6 (предполагаю, у меня cbuilder 6) есть модуль graphutil... советую глянуть...

В конторе Delphi 5 до сих пор как основной инструмент разработки принят...  :-(



Страницы: 1 2 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.04 c
1-1104938889
X-Disa
2005-01-05 18:28
2005.01.23
Удаление ветки реестра


1-1105287896
Ищущий ответ
2005-01-09 19:24
2005.01.23
OpenDialog


3-1103568976
Guitar
2004-12-20 21:56
2005.01.23
Как вернуть из хран проц параметры, и записи одновременно


4-1102433538
Eagle Owl
2004-12-07 18:32
2005.01.23
Температура процессора...


3-1103574058
Макс
2004-12-20 23:20
2005.01.23
Сложный запрос с вложенными запросами для Access (ADO)