powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / как вычислить цвет?
12 сообщений из 12, страница 1 из 1
как вычислить цвет?
    #37265384
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть например два цвета
clBtnFace (у меня серый стандартный) и clSkyBlue

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

2. Для затемнения (осветления) используется следующий алгоритм: перевод RGB->HSV, изменение V, перевод обратно. Смотри модуль GraphUtils, там есть нужные функции.
...
Рейтинг: 0 / 0
как вычислить цвет?
    #37265482
Gust2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81,

Навскидку:
1) Если действительно нужны алгоритмы (например, для реализации фильтров), то нужно начать с их изучения. Может быть это чем-то поможет
2) Взять какой-нибудь графический редактор photoshop, смешать нужные цвета по нужному алгоритму, запомнить получившиеся значения в какой-нибудь таблице, дальше работать с этой таблицей.
...
Рейтинг: 0 / 0
как вычислить цвет?
    #37265513
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
благодарю, вот нашел

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
 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 ;
...
Рейтинг: 0 / 0
как вычислить цвет?
    #37266352
ambarka_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Советую только четко понимать, что нужно передавать в качестве TColor
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 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 ;
...
Рейтинг: 0 / 0
как вычислить цвет?
    #37266357
ambarka_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вставлял из рабочего проекта, потому SM это ShowMessage (думаю и так понятно)
...
Рейтинг: 0 / 0
как вычислить цвет?
    #37266392
Gust2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ambarka_max,
Префикс "А" используется в именах параметров методов, но не переменных. Использование переменной Result в процедуре также может ввести внешнего читателя в заблуждение.

Почему бы для повторяющегося участка кода не использовать процедуру?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 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 ;

, тогда получим
Код: plaintext
1.
2.
3.
4.
 procedure  TfrmVozrat.Button1Click(Sender: TObject);
 begin 
  ShowColorInfo(clBtnFace);
  ShowColorInfo(ColorToRGB(clBtnFace));
 end ;
...
Рейтинг: 0 / 0
как вычислить цвет?
    #37267063
ambarka_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gust2002, вы абсолютно правы. Я все это понимаю, кусок кода писал для примера, нарушая правила, чтобы донести мысль.
Кстати я не очень люблю локальные переменные без префиксов (если наименование больше 2-х символов) , так как они могут перекрывать внешние проперти/глобальные переменные/функции, вобщем это личное предпочтение.
...
Рейтинг: 0 / 0
как вычислить цвет?
    #37267279
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Raize Components есть готовые функции.

RzCommon.LighterColor
RzCommon.DarkerColor
RzCommon.BlendColors
...
Рейтинг: 0 / 0
как вычислить цвет?
    #37267292
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Они и в VCL есть. Просто некоторые предпочитают говнокоды из инета скачивать, вместо того чтобы документацию читать.
это из модуля GraphUtil
Код: plaintext
1.
2.
 function  GetHighLightColor( const  Color: TColor; Luminance: Integer =  19 ): TColor;
 function  GetShadowColor( const  Color: TColor; Luminance: Integer = - 50 ): TColor;
...
Рейтинг: 0 / 0
как вычислить цвет?
    #37267418
Gust2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ambarka_max,
Кстати я не очень люблю локальные переменные без префиксов (если наименование больше 2-х символов)
Имхо если вводите свой стандарт, то будет лучше, если он не будет пересекаться с существующими.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
как вычислить цвет?
    #39851473
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис Для затемнения (осветления) используется следующий алгоритм: перевод RGB->HSV, изменение V, перевод обратно. Смотри модуль GraphUtils, там есть нужные функции.
Таких советов я за прошедшие годы раздавал множество, и сам ему следовал до той поры, пока мне не потребовалось, чтобы это работало быстро. Когда посмотрел реализацию в VCL - понял, что идея анекдота "свести задачу к предыдущей" до сих пор имела неправильное воплощение.
Собственно, что мы хотим получить на выходе? Колинеарный цветовой вектор другой длины. А раз так, то HSV тут вообще не нужен, по крайней мере в части сложных вычислений H и S.
Все намного проще, примерно так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure ChangeV(var R,G,B: byte; V: integer; asRelative: boolean);
var  Vold: integer;
begin
  Vold:=(r+g+b+1) div 3; //+1 чтобы round не использовать.
  if asRelative
    then V:=Max(0, VOld+V);

  if Vold=0 then begin
    V:=EnsureRange(V,0,255);
    R:=V;
    G:=V;
    B:=V;
  end
  else begin
     R:=Max(255, R*V div Vold);
     G:=Max(255, G*V div Vold);
     B:=Max(255, B*V div Vold);
  end;
end;
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / как вычислить цвет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]