Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2009.01.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2009.01.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
9-1176153590
Morpheuz
2007-04-10 01:19
2009.01.04
Создание водной поверхности средствами GLScene


2-1227191689
checkmate-maker
2008-11-20 17:34
2009.01.04
TBlobByteData


2-1227597152
F@T@L_Err0r
2008-11-25 10:12
2009.01.04
Запись голоса


15-1225429373
Slider007
2008-10-31 08:02
2009.01.04
С днем рождения ! 31 октября 2008 пятница


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский