Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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://delphimaster.net/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://delphimaster.net/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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.6 MB
Время: 0.037 c
14-1104590288
AlterEgo of WondeRu
2005-01-01 17:38
2005.01.23
Чего бы Вы хотели достичь в 2005 году...


1-1105110167
race1
2005-01-07 18:02
2005.01.23
scroll


6-1099436336
Stexen
2004-11-03 01:58
2005.01.23
Asynchronous socket error 10053?


9-1097696674
rydmi
2004-10-13 23:44
2005.01.23
Вращение спрайтов


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский