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

Вниз

Как получить один цвет из другого?   Найти похожие ветки 

 
Dr. Andrew   (2007-09-01 20:05) [0]

Добрый вечер, Мастера! Есть ли формула получения одного цвета из другого? Допустим имеем цвет $00F5EDE3. Как используя это значение программно (алгоритмом) получить цвет $005C4500? Спасибо!


 
Dr. Andrew   (2007-09-01 20:16) [1]

Мне необходимо что-то вроде такого алгоритма:


var NewColor : TColor;

function Convert(AColor : TColor) : TColor;
begin
 ?????????
 Result := ??????;
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  NewColor := Convert($00F5EDE3); // NewColor = $005C4500
end;


Спасибо за любые идеи и подсказки!


 
Dr. Andrew   (2007-09-01 20:26) [2]

Небольшое дополнение. получение не любого цвета, а от светлых тонов - темных оттенков того же тона. Например, из светло-голубого получить (программно!) насыщенный синий, из розового - насыщенный красный и так далее. Все в пределах одного тона, только большей насыщенности. Спасибо!


 
Efir ©   (2007-09-01 20:56) [3]

Так тебе контрасность или насыщенность?

Если контрасность, то можно сделать так:

procedure Contrast(var Bitmap:TBitmap;L:Integer);
var
 pix:PByteArray;
 x,y,i:integer;
 dl:real;

function Limit(R:Smallint):byte;
begin
 if R>255 then R:=255;
 if R<0 then R:=0;
 Result:=R;
end;

begin
 dl:=L/127;
 Bitmap.PixelFormat:=pf24bit;
 for y:=0 to Bitmap.Height-1 do begin
   pix:=Bitmap.ScanLine[y];
   for x:=0 to Bitmap.Width*3-1 do begin
     if pix[x]>128 then pix[x]:=Limit(Round((pix[x]-128)*dl+pix[x])) else
     pix[x]:=Limit(Round(pix[x]-(128-pix[x])*dl));
   end;
 end;
end;

А если насыщенность, то можно перевети цвет из RGB в модель HLS, изменить значение S и перевети снова в RGB.


 
Pavia ©   (2007-09-01 21:23) [4]

Триминг, переход от однй велечены к другой y*A+(1-y)*C
y - коэффицент от 0 до 1
Для изменения насыщенности
C=(R+G+B)/3
A=R,G,B для каждой состовляющей цвета

y -  будешь менять от 1 до 2 для увиличени, а от 0 до 1 для уменьшения


 
homm ©   (2007-09-01 21:40) [5]

> Допустим имеем цвет $00F5EDE3. Как используя это значение
> программно (алгоритмом) получить цвет $005C4500?

Ммм…

function PoluchitZnachtenie(Par1: DWORD): DWORD;
begin
  Result := Par1 - $0099A8E3;
end;


 
Dr. Andrew   (2007-09-01 21:50) [6]

Спасибо за идеи.

Efir
Исапользование битмапа не годится так как надо манипулировать исключительно переменной : TColor.

Pavia
А можно привести практический пример.

homm
А что это за константа - $0099A8E3? Она одна для всех тонов?


 
Dr. Andrew   (2007-09-01 21:58) [7]

homm
Функция не работает если ввести иные параметры. Вот например, если так:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Form1.Color := PoluchitZnachtenie($009FC8FF);
end;

то светло-оранжевый должен стать насыщенно оранжевым, а получаем после функции черный цвет. Значит константа $0099A8E3 не универсальная? Тогда как ее вычислить?


 
homm ©   (2007-09-01 22:05) [8]

> Значит константа $0099A8E3 не универсальная? Тогда как ее
> вычислить?

Нет, она не универсальна, но она позволяет получить допустим цвет $005C4500 из цвета $00F5EDE3 :)


 
Dr. Andrew   (2007-09-01 22:48) [9]

homm
Хорошо тогда как вывести универсальное выражения для получения нужного цвета?


 
homm ©   (2007-09-01 22:59) [10]

> [9] Dr. Andrew   (01.09.07 22:48)

Если так и не понял, то [5] — всего лишь стеб над твоим искусством задавать вопросы, та функция делает ровно то, что написано в [0], не больше, не меньше.


 
Pavia ©   (2007-09-01 23:15) [11]

Тут коэффицент Y от -100 до +100
function Saturation(Color:TColor; Y:Integer):TColor;
var R,G,B:Integer;
A,C:Real;
begin
A:=(Y+100)/100;
R:=(Color shr 16) and $FF;
G:=(Color shr 8) and $FF;
B:=Color and $FF;

C:=(R+G+B)/3;

R:=Round(A*R+(1-A)*C);
if R<0 then R:=0;
if R>255 then R:=255;

G:=Round(A*G+(1-A)*C);
if G<0 then G:=0;
if G>255 then G:=255;

B:=Round(A*B+(1-A)*C);
if B<0 then B:=0;
if B>255 then B:=255;
Result:=(R shl 16)+(G shl 8) +B;
end;


 
Dr. Andrew   (2007-09-02 01:37) [12]

Всем Мастерам спасибо. Особенно Pavia! Вопрос решен. Обсуждение закрыто. Спокойной ночи!


 
vrem   (2007-09-02 22:24) [13]

>вопрос решён, обсуждение закрыто
ну ты даёшь, тебе вправляли вот и всё,
а ты даже вникать не хотел, деятель :)


 
Dr. Andrew   (2007-09-03 03:05) [14]

Ну почему же я внял все что мне внимали. Спасибо всем.



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

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

Наверх




Память: 0.5 MB
Время: 0.014 c
2-1226829339
vegarulez
2008-11-16 12:55
2009.01.04
подскажите про MyHotKey


15-1225441518
Vlad Oshin
2008-10-31 11:25
2009.01.04
Работа. Программиста никому не надо? :)


2-1227286412
savyhinst
2008-11-21 19:53
2009.01.04
LstVew.Objects


1-1205179677
Бэтман
2008-03-10 23:07
2009.01.04
Вывести месяц


2-1227123674
Alex_Ford
2008-11-19 22:41
2009.01.04
Как хранить пароли?