-
Добрый вечер, Мастера! Есть ли формула получения одного цвета из другого? Допустим имеем цвет $00F5EDE3. Как используя это значение программно (алгоритмом) получить цвет $005C4500? Спасибо!
-
Мне необходимо что-то вроде такого алгоритма:
var NewColor : TColor;
function Convert(AColor : TColor) : TColor;
begin
?????????
Result := ??????;
end;
procedure TForm1.Button1Click(Sender : TObject);
begin
NewColor := Convert($00F5EDE3); end;
Спасибо за любые идеи и подсказки!
-
Небольшое дополнение. получение не любого цвета, а от светлых тонов - темных оттенков того же тона. Например, из светло-голубого получить (программно!) насыщенный синий, из розового - насыщенный красный и так далее. Все в пределах одного тона, только большей насыщенности. Спасибо!
-
Так тебе контрасность или насыщенность?
Если контрасность, то можно сделать так:
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.
-
Триминг, переход от однй велечены к другой y*A+(1-y)*C y - коэффицент от 0 до 1 Для изменения насыщенности C=(R+G+B)/3 A=R,G,B для каждой состовляющей цвета
y - будешь менять от 1 до 2 для увиличени, а от 0 до 1 для уменьшения
-
> Допустим имеем цвет $00F5EDE3. Как используя это значение > программно (алгоритмом) получить цвет $005C4500?
Ммм…
function PoluchitZnachtenie(Par1: DWORD): DWORD;
begin
Result := Par1 - $0099A8E3;
end;
-
Спасибо за идеи.
Efir Исапользование битмапа не годится так как надо манипулировать исключительно переменной : TColor.
Pavia А можно привести практический пример.
homm А что это за константа - $0099A8E3? Она одна для всех тонов?
-
homm Функция не работает если ввести иные параметры. Вот например, если так:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Color := PoluchitZnachtenie($009FC8FF);
end;
то светло-оранжевый должен стать насыщенно оранжевым, а получаем после функции черный цвет. Значит константа $0099A8E3 не универсальная? Тогда как ее вычислить?
-
> Значит константа $0099A8E3 не универсальная? Тогда как ее > вычислить?
Нет, она не универсальна, но она позволяет получить допустим цвет $005C4500 из цвета $00F5EDE3 :)
-
homm Хорошо тогда как вывести универсальное выражения для получения нужного цвета?
-
> [9] Dr. Andrew (01.09.07 22:48)
Если так и не понял, то [5] — всего лишь стеб над твоим искусством задавать вопросы, та функция делает ровно то, что написано в [0], не больше, не меньше.
-
Тут коэффицент 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;
-
Всем Мастерам спасибо. Особенно Pavia! Вопрос решен. Обсуждение закрыто. Спокойной ночи!
-
>вопрос решён, обсуждение закрыто ну ты даёшь, тебе вправляли вот и всё, а ты даже вникать не хотел, деятель :)
-
Ну почему же я внял все что мне внимали. Спасибо всем.
|