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