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

Вниз

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

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

Наверх





Память: 0.48 MB
Время: 0.009 c
2-1225273309
Iriss
2008-10-29 12:41
2008.12.07
Процедура внутри процедуры


15-1222860991
stas
2008-10-01 15:36
2008.12.07
MSSQL 2005 Интересное преобразование Float в строку


15-1223242931
обана!
2008-10-06 01:42
2008.12.07
А было бы нефигово


15-1222915880
Slider007
2008-10-02 06:51
2008.12.07
С днем рождения ! 2 октября 2008 четверг


2-1225276588
031178
2008-10-29 13:36
2008.12.07
Как сравнить время





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