Главная страница
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 до сих пор как основной инструмент разработки принят...  :-(


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

В общем Background := Background xor $808080  оказалось неплохой идеей. Цвета более-менее сочетаются.
Покажу заказчику возможные проблемы, пусть сам думае...

Всем большое спасибо.


 
Anatoly Podgoretsky ©   (2005-01-12 14:52) [42]

boriskb ©   (12.01.05 14:35) [35]
Ограниченый набор цветов и предпрсмотр сразу в том же диалоге, хороший пример настройка редактора Дельфи.


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

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

Ну это так и сделано. Щстановился на том, что в этом диалоге настройки добавил задание цвета выделения, которое по-умолчанию поставил xor $808080


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

Anatoly Podgoretsky ©   (12.01.05 14:52) [42]

А тема "Как слушать заказчика и что из его требований выполнять, а с чем спорить" - вообще... говорить можно бесконечно :)


 
MBo ©   (2005-01-12 14:59) [45]

в большинстве случаев приемлемо:

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;


 
pasha_golub ©   (2005-01-12 15:05) [46]

wicked ©   (12.01.05 14:43) [39]
а поскольку мне медведь не только на ухо наступил, но и в глаз плюнул,

LOL


 
Alx2 ©   (2005-01-12 15:10) [47]

>MBo ©   (12.01.05 14:59)
для цвета aColor = 10254470 результат неважный :(


 
MBo ©   (2005-01-12 15:19) [48]

>Alx2 ©   (12.01.05 15:10) [47]
не очень симпатичный, конечно, но все же достаточно контрастный.


 
Ega23 ©   (2005-01-12 15:32) [49]

2 MBo ©   (12.01.05 14:59) [45]
Интересное решение. Спасибо.


 
Alx2 ©   (2005-01-12 16:13) [50]

Раз уж написал, то не выкидывать же. :)
Вот моя идея:

Procedure TForm1.Button3Click(Sender: TObject);
Var
 Templates: Array[0..7] Of TColor;

 Function GetDistanceColor(aColor: TColor): TColor; // Ищем "самый далекий" цвет
 Var
   k, dist, maxdist, best: Integer;
 Begin
   best := 0;
   maxdist := GetRValue(aColor) + GetGValue(aColor) + getBValue(aColor);
   For k := 1 To 7 Do
     Begin
       dist := abs(GetRValue(aColor) - GetRValue(Templates[k])) +
         abs(GetGValue(aColor) - GetGValue(Templates[k])) +
         abs(GetBValue(aColor) - GetBValue(Templates[k]));
       If dist > maxdist Then
         Begin
           maxdist := dist;
           best := k;
         End;
     End;
   Result := Templates[best];
 End;
Var
 k1, k2, k3, c: Integer;
Begin
// Сначала заполним вершины куба
 c := 0;
 For k1 := 0 To 1 Do
   For k2 := 0 To 1 Do
     For k3 := 0 To 1 Do
       Begin
         Templates[c] := rgb(255 * k1, 255 * k2, 255 * k3);
         inc(c);
       End;

 If ColorDialog1.Execute Then
   Begin
     Color := ColorDialog1.Color;
     Label1.Caption := IntToStr(Color);
     Label1.Font.Color := GetDistanceColor(ColorDialog1.Color);
   End;
End;


 
pasha_golub ©   (2005-01-12 16:17) [51]

Alx2 ©   (12.01.05 16:13) [50]
Ага, а мне без комментариев кидал... ;-)


 
Alx2 ©   (2005-01-12 16:32) [52]

>pasha_golub ©   (12.01.05 16:17) [51]
Их так не хватало? :)


 
BiN ©   (2005-01-12 16:33) [53]

А не проще ли заставить этого дотошного клиента самому цвет подсветки настраивать.


 
Alx2 ©   (2005-01-12 22:04) [54]

Тромознул с первым вариантом.
Так гораздо короче, быстрее и понятнее:

function GetDColor(const aColor: TColor): TColor;
Type TRec=
   packed record
   r, g, b, dummy: byte
 end;
begin
 Result := aColor;
 with TRec((@Result)^) do
 begin
   if r > 127 then r := 0 else r := 255;
   if g > 127 then g := 0 else g := 255;
   if b > 127 then b := 0 else b := 255;
 end;
end;


 
TButton ©   (2005-01-12 22:34) [55]

вот тебе апельсин =)
http://www.webwhirlers.com/colors/wizard.asp


 
pasha_golub ©   (2005-01-13 10:33) [56]

Мужики, всю ночь не спал, одну штуку вспомнил. Если цвет системный, например, clHighlight, то у него представление отличное от формата RGB. Короче, в старшем байте стоит $80, что говорит о его системности, а в младшем значение типа byte. Короче, цвет clHighlight на самом деле будет представлен как: $8000000D.

Шобы это дело победить, нужно внутри процедуры поставить таку штуку:


...
AColor := ColorToRGB(AColor);
...



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

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

Наверх




Память: 0.62 MB
Время: 0.026 c
14-1104923780
Почему
2005-01-05 14:16
2005.01.23
Узнать размер файла (LIMBO 04.01.05 23:51)


9-1097572868
VolanD
2004-10-12 13:21
2005.01.23
Direct3D


6-1099294965
Ivolg
2004-11-01 10:42
2005.01.23
Http


1-1105602524
Gek1
2005-01-13 10:48
2005.01.23
Маленькие буквы в строке


3-1103522844
Layner
2004-12-20 09:07
2005.01.23
Господа, посоветуйте по EhLib, как в нем сделать