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

Вниз

"Цветные" проблемы   Найти похожие ветки 

 
MsGuns ©   (2008-10-28 00:29) [0]

Собственно, их две

1. Нужно определить "контрастный" цвет для любого заданного из двух возможных: белого и черного. Так, чтобы на любом фоне символы, выкрашенные в "контрастный" белый/черный цвет, были видны совершенно четко. Как ни крутил RGB в поиска надежного алгоритма, ничего не получилось

2. Нужно найти формулу получение градиента (плавного видимого дискрета) между двумя произвольно заданными цветами и указанным числом градиентных "точек"

Буду признателен за любую помощь или ссылки


 
Германн ©   (2008-10-28 02:31) [1]

"Нужно"
Вот от тебя этого не ожидал!


 
Юрий Зотов ©   (2008-10-28 04:48) [2]

Из кода компонента XPMenu:

// Контрастный цвет:
function GetInverseColor(AColor: TColor): TColor;
begin
 Result := ColorToRGB(AColor) xor $FFFFFF;
end;

function NewColor(ACanvas: TCanvas; clr: TColor; Value: integer): TColor;
var
 r, g, b: integer;
begin
 if Value > 100 then Value := 100;
 clr := ColorToRGB(clr);
 r := Clr and $000000FF;
 g := (Clr and $0000FF00) shr 8;
 b := (Clr and $00FF0000) shr 16;

 r := r + Round((255 - r) * (value / 100));
 g := g + Round((255 - g) * (value / 100));
 b := b + Round((255 - b) * (value / 100));

 //Result := Windows.GetNearestColor(ACanvas.Handle, RGB(r, g, b));
 Result := RGB(r, g, b);
end;

// Градиентная заливка:
procedure TXPMenu.DrawGradient(ACanvas: TCanvas; ARect: TRect;
 IsRightToLeft: boolean);
var
 i: integer;
 v: integer;
 FRect: TRect;
begin
 fRect := ARect;
 V := 0;
 if IsRightToLeft then
 begin
   fRect.Left := fRect.Right - 1;
   for i := ARect.Right Downto ARect.Left do
   begin
     if (fRect.Left < ARect.Right)
       and (fRect.Left > ARect.Right - FIconWidth + 5) then
       inc(v, 3)
     else
       inc(v, 1);

     if v > 96 then v := 96;
     ACanvas.Brush.Color := NewColor(ACanvas, FFIconBackColor, v);
     ACanvas.FillRect(fRect);

     fRect.Left := fRect.Left - 1;
     fRect.Right := fRect.Left - 1;
   end;
 end
 else
 begin
   fRect.Right := fRect.Left + 1;
   for i := ARect.Left to ARect.Right do
   begin
     if (fRect.Left > ARect.Left)
       and (fRect.Left < ARect.Left + FIconWidth + 5) then
       inc(v, 3)
     else
       inc(v, 1);

     if v > 96 then v := 96;
     ACanvas.Brush.Color := NewColor(ACanvas, FFIconBackColor, v);
     ACanvas.FillRect(fRect);

     fRect.Left := fRect.Left + 1;
     fRect.Right := fRect.Left + 1;
   end;
 end;
end;


 
Ega23 ©   (2008-10-28 09:41) [3]

Дано мне когда-то очень давно кем-то на этом форуме. Кем - не помню.

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;


 
MsGuns ©   (2008-10-28 12:58) [4]

>Юрий Зотов ©   (28.10.08 04:48) [2]

Спасибо, Юрий, большое, но..

>Result := ColorToRGB(AColor) xor $FFFFFF;

Не помогает, я же вроде в топике писАл, что пробовал шаманить с RGB ;(
Как пример можно взять clTeal. Опять же в сабже четко написано, что форграундовый цвет может быть либо белый, либо черный.

>function NewColor(ACanvas: TCanvas; clr: TColor; Value: integer): TColor;

На светлых фонах текста не видно вообще. С любым значением смещения Value

Заливка тоже не отвечает поставленной задаче,- нужно не плавно залить область канвы, а дать указанное кол-во "промежуточных" цветов.

>Ega23 ©   (28.10.08 09:41) [3]

Эффекет получше, но тоже далек от совершенства ибо не обеспечивает "монохромности" форграундового цвета.

Чтобы понятно было, для чего эти изгаляции, скажу что есть проблема автоматического выбора цвета фонта в зависимости от фона и лежит в плоскости веб-дизайна.


 
Sapersky   (2008-10-28 13:44) [5]

Может это подойдёт:

function GetOptimalBkColor(AColor: TColor): TColor;
var
R, G, B: Word;
begin
R := GetRValue(AColor);
G := GetGValue(AColor);
B := GetBValue(AColor);
if 0.222*R + 0.707*G + 0.071*B <= 127 then
 Result := clWhite
else
 Result := clBlack;
end;

( guav ©   (28.11.07 09:46) )


 
MBo ©   (2008-10-28 14:30) [6]

>Заливка тоже не отвечает поставленной задаче,- нужно не плавно залить область канвы, а дать указанное кол-во "промежуточных" цветов.

Приведенный код - линейная интерполяция по каждой из цветовых составляющих со 100 градациями.
в общем случае для N точек красная составляющая для i-й точки:

r[i] := r0 + Round((r1-r0)*i/n)


 
MsGuns ©   (2008-10-28 15:51) [7]

>Sapersky   (28.10.08 13:44) [5]

Спасибо огромное, - похоже, что именно то, что надо
Интересно, откуда эти кабалистические коэффициенты, "монохромизирующие" цвет ?

>MBo ©   (28.10.08 14:30) [6]

Да - да, я понял. Осталось только "причесать" код для нужного результата (список TColor, состоящий из заданного количества дискретов)

Спасибо всем


 
Anatoly Podgoretsky ©   (2008-10-28 16:08) [8]

> MsGuns  (28.10.2008 15:51:07)  [7]

Я еще в 2003 году сообщел четыре формулы, здесь на сервере.
Вот они. Это обычная колометрия, зависит от устройства вывода.

Y = K1*R + K2*G + K3*B

1. 0,360*R + 0.530*G + 0.110*B
2. Стандаpт CCIR 601-1 (как в стандаpтной VGA-ой функции):
  0,299*R + 0,587*G + 0,114*B
3. Стандаpт CCIR 709:
  0,213*R + 0,715*G + 0,072*B
4. Стандаpт ITU:
  0,222*R + 0,707*G + 0,071*B



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
6-1196064124
botaniQ
2007-11-26 11:02
2008.12.07
Select в WebBrowser


2-1225113127
Nil
2008-10-27 16:12
2008.12.07
Зашифровать содержимое TStringList


15-1223305384
Slider007
2008-10-06 19:03
2008.12.07
С днем рождения ! 4 сентября 2008 суббота


15-1222839778
ВадимЛ
2008-10-01 09:42
2008.12.07
Починить Делфи Д5 (пути ?)


15-1223001832
Slider007
2008-10-03 06:43
2008.12.07
С днем рождения ! 3 октября 2008 пятница