как вычислить цвет?

PG81
Дата: 17.05.2011 17:34:49
есть например два цвета
clBtnFace (у меня серый стандартный) и clSkyBlue

НЕобходимо сделать какбы наложение цветов,т.е. если я их какбы складываю, то синий должен получиться более темным.
(вдруг это как-то не то)
ИЛИ
другой вариант. как затемнить любой цвет?
Соколинский Борис
Дата: 17.05.2011 17:54:04
PG81,
1. Складываешь покомпонентно R,G,B по формуле
B1*A+B2*(1-A), A - прозрачность.

2. Для затемнения (осветления) используется следующий алгоритм: перевод RGB->HSV, изменение V, перевод обратно. Смотри модуль GraphUtils, там есть нужные функции.
Gust2002
Дата: 17.05.2011 17:57:44
PG81,

Навскидку:
1) Если действительно нужны алгоритмы (например, для реализации фильтров), то нужно начать с их изучения. Может быть это чем-то поможет
2) Взять какой-нибудь графический редактор photoshop, смешать нужные цвета по нужному алгоритму, запомнить получившиеся значения в какой-нибудь таблице, дальше работать с этой таблицей.
PG81
Дата: 17.05.2011 18:06:35
благодарю, вот нашел

function ChangeColor(InputColor: TColor; Lighten: Boolean=false): TColor;
 var
   r,g,b: extended;
begin
  r := GetRValue(InputColor);
  g := GetGValue(InputColor);
  b := GetBValue(InputColor);
  if Lighten = True then
   begin
     r := r+((r/255)*100);
     g := g+((g/255)*100);
     b := b+((b/255)*100);
   end else
   begin
     r := r-((r/255)*100);
     g := g-((g/255)*100);
     b := b-((b/255)*100);
   end;

  if r > 255 then r := 255;
   if r < 0 then r := 0;
   if g > 255 then g := 255;
   if g < 0 then g := 0;
   if b > 255 then b := 255;
   if b < 0 then b := 0;

  Result := RGB(byte(Round(r)),byte(Round(g)),byte(Round(b)));
end;
ambarka_max
Дата: 18.05.2011 09:37:03
Советую только четко понимать, что нужно передавать в качестве TColor
procedure TfrmVozrat.Button1Click(Sender: TObject);
var
  AResult: string;
  R,G,B: Byte;
  AColor: TColor;
begin
  AColor:= clBtnFace;
  R:= GetRValue(AColor);
  G:= GetGValue(AColor);
  B:= GetBValue(AColor);
  FmtStr(AResult, '%s%.8x R=%d G=%d B=%d', [HexDisplayPrefix, AColor, R, G, B]);
  SM(AResult);
  AColor:= ColorToRGB(clBtnFace);
  R:= GetRValue(AColor);
  G:= GetGValue(AColor);
  B:= GetBValue(AColor);
  FmtStr(AResult, '%s%.8x R=%d G=%d B=%d', [HexDisplayPrefix, AColor, R, G, B]);
  SM(AResult);
end;
ambarka_max
Дата: 18.05.2011 09:38:29
Вставлял из рабочего проекта, потому SM это ShowMessage (думаю и так понятно)
Gust2002
Дата: 18.05.2011 10:01:48
ambarka_max,
Префикс "А" используется в именах параметров методов, но не переменных. Использование переменной Result в процедуре также может ввести внешнего читателя в заблуждение.

Почему бы для повторяющегося участка кода не использовать процедуру?
procedure ShowColorInfo(AColor: TColor);
var
  ColorInfo: string;
  R,G,B: Byte;
begin
  R:= GetRValue(AColor);
  G:= GetGValue(AColor);
  B:= GetBValue(AColor);
  FmtStr(ColorInfo, '%s%.8x R=%d G=%d B=%d', [HexDisplayPrefix, AColor, R, G, B]);
  SM(ColorInfo);
end;

, тогда получим
procedure TfrmVozrat.Button1Click(Sender: TObject);
begin
  ShowColorInfo(clBtnFace);
  ShowColorInfo(ColorToRGB(clBtnFace));
end;
ambarka_max
Дата: 18.05.2011 13:26:10
Gust2002, вы абсолютно правы. Я все это понимаю, кусок кода писал для примера, нарушая правила, чтобы донести мысль.
Кстати я не очень люблю локальные переменные без префиксов (если наименование больше 2-х символов) , так как они могут перекрывать внешние проперти/глобальные переменные/функции, вобщем это личное предпочтение.
Квейд
Дата: 18.05.2011 14:51:15
В Raize Components есть готовые функции.

RzCommon.LighterColor
RzCommon.DarkerColor
RzCommon.BlendColors
Соколинский Борис
Дата: 18.05.2011 14:56:17
Они и в VCL есть. Просто некоторые предпочитают говнокоды из инета скачивать, вместо того чтобы документацию читать.
это из модуля GraphUtil
function GetHighLightColor(const Color: TColor; Luminance: Integer = 19): TColor;
function GetShadowColor(const Color: TColor; Luminance: Integer = -50): TColor;