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



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

Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.041 c
1-1105457924
avi
2005-01-11 18:38
2005.01.23
Помогите с загрузкой текста из файла.


1-1105602724
Anonimus
2005-01-13 10:52
2005.01.23
Приложение без форм


1-1105039721
Raider
2005-01-06 22:28
2005.01.23
Как изменить цвет одной строки в RichEdit е, и в ListView е ?


1-1105273913
Zahar
2005-01-09 15:31
2005.01.23
помогите с разобраться с потоками


3-1103206423
Shizuku
2004-12-16 17:13
2005.01.23
Управляющие запросы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский