Форум: "Основная";
Текущий архив: 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