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

Вниз

сложение цвета   Найти похожие ветки 

 
XcCCC   (2009-08-15 13:26) [40]

[20] Вдогонку - желтый с синим должен давать белый, а не зеленый.

это как ? я смешиваю 2 краски с желтым и синим, ну никак не белую не получить!
Оговорюсь мне нужно смешивать реальные краски в банке.
Желтый с синим дает серый по функции

function GetMixColor (c1, c2: TColor): TColor;
begin
Result := RGB (
                (GetRValue (c1) + GetRValue (c2)) div 2,
                (GetGValue (c1) + GetGValue (c2)) div 2,
                (GetBValue (c1) + GetBValue (c2)) div 2
              );
end;


что скорее так и есть
синий+красный=фиолетовый
синий+белый=светло синий

Теперь мучаюсь добавить в формулу процентное соотношение.
Изначально в формуле 1:1
Буду думать как сделать к примеру 1:2, 1:3, 2:3, 1:4, 3:4


 
Дмитрий С ©   (2009-08-15 13:30) [41]


> Юрий Зотов ©   (15.08.09 12:40) [37]

А ты реально не понимаешь что я хочу сказать или притворяешься?
Возьми два прозрачных цветных стекла. Синее или Желтое. совмести и посмотри на просвет. Какой получится? Белый?


 
Дмитрий С ©   (2009-08-15 13:32) [42]


> Желтый с синим дает серый по функции
>
> function GetMixColor (c1, c2: TColor): TColor;
> begin
> Result := RGB (
>                 (GetRValue (c1) + GetRValue (c2)) div 2,
>
>                 (GetGValue (c1) + GetGValue (c2)) div 2,
>
>                 (GetBValue (c1) + GetBValue (c2)) div 2
>               );
> end;
>
> что скорее так и есть

Что тебе нужно то?


 
Юрий Зотов ©   (2009-08-15 13:33) [43]

Вот слегка модифицированный пример - введены оттенки цветов (то есть, яркость). На форму дополнительно кинуть TrackBar, назначить ему тот же обработчик OnChange и код этого обработчик слегка подправить:

// OnShow, ComboBoxN.OnChange, TrackBar.OnChange
procedure TForm1.ChangeColor(Sender: TObject);
var
 Y, C1, C2, C3: cardinal;
begin
 Y := MulDiv($FF, TrackBar1.Position, TrackBar1.Max);
 C1 := (Y shl (ComboBox1.ItemIndex * 8));
 C2 := (Y shl (ComboBox2.ItemIndex * 8));
 C3 := (Y shl (ComboBox3.ItemIndex * 8));
 Color := MixColors(C1, C2, C3);
 Caption := IntToHex(Color, 8)
end;


 
vrem   (2009-08-15 13:48) [44]

Дмитрий С ©
наверно он имеет в виду не чисто белый, а зеленовато-белый, яркий, в р-г-б же одинаковые значения сразу всех каналов р, г, б задают оттенки серого

*летают. но низэнько-низэнько :))


 
Дмитрий С ©   (2009-08-15 13:51) [45]

Чуть мозг не взорвал.
Голубой : 00ffff  (не синий блин)
Желтый: ffff00
после обычного GetMixColor чуть выше приведеного действительно дает зеленый оттенок.


 
Дмитрий С ©   (2009-08-15 13:54) [46]


> Юрий Зотов ©   (15.08.09 13:33) [43]

я прекрасно представляю как образуются цвета на экране. Причем тут смешиваение тоды?


 
Юрий Зотов ©   (2009-08-15 14:10) [47]

> XcCCC   (15.08.09 13:26) [40]
> Дмитрий С ©   (15.08.09 13:32) [42]

1. Читайте [24] и [34]. Краска и стекло поглощают, а монитор излучает. Поймите разницу.

Желтая краска (стекло). Поглощают синий, остаются красный и зеленый.
Синяя краска (стекло). Поглощают красный и зеленый, остается синий.

В итоге - если поглощение 100%-ное, то не останется ничего и получим черный. Но в реальности 100%-ного поглощения не бывает, поэтому получаем не черный, а различные оттенки.

Далее. Если реальные (то есть, не 100%-ные) поглощения красного, зеленого и синего идеально одинаковы, то это будет серый цвет (что и наблюдаем в [40]). То есть, именно белый, только с пониженной яркостью.

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

2. Воспроизведите пример с модификацией [43] и подвигайте ползунок яркости. Если останутся вопросы, замените этот ползунок тремя - чтобы регулировалась не общая яркость, а яркость каждого цвета отдельно. Подвигайте ползунки - все увидите сами.

==============

Пример точно воспроизводит смешение цветов в RGB-модели. С некоторой дискретностью, разумеется - потому что в один байт (цвет) нельзя записать дробное значение.


 
Дмитрий С ©   (2009-08-15 14:18) [48]


> Юрий Зотов ©   (15.08.09 14:10) [47]

Нагляднее будет моргать очень быстро. Красный/Зеленый/Красный/Зеленый/... а казаться будет что Желтый.


 
Anatoly Podgoretsky ©   (2009-08-15 18:31) [49]

> XcCCC  (15.08.2009 13:26:40)  [40]

А ты по CMYK смешивай краски в банке


 
Юрий Зотов ©   (2009-08-15 19:25) [50]

Дабы все-таки взлетел...
:o)

Вот полный код формы. Ничего на нее кидать не надо, сразу запускаем.

unit ColorsMixing2;

interface

uses
 Windows, Graphics, Controls, Forms, ComCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   procedure FormShow(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   tbR, tbG, tbB: TTrackBar;
   Panel: TPanel;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses
 Math;

function MixColors(C1, C2: cardinal): cardinal; overload;
var
 R, G, B : byte;
begin
 R := Min(GetRValue(C1) + GetRValue(C2), 255);
 G := Min(GetGValue(C1) + GetGValue(C2), 255);
 B := Min(GetBValue(C1) + GetBValue(C2), 255);
 Result := RGB(R, G, B)
end;

function MixColors(C1, C2, C3: cardinal): cardinal; overload;
var
 C: cardinal;
begin
 C := MixColors(C1, C2);
 Result := MixColors(C, C3)
end;

procedure TForm1.FormShow(Sender: TObject);
var
 CR, CG, CB: cardinal;
begin
 CR := tbR.Max - tbR.Position;
 CG := (tbG.Max - tbG.Position) shl 8;
 CB := (tbB.Max - tbB.Position) shl 16;
 Panel.Color := MixColors(CR, CG, CB);
 Caption := ColorToString(Panel.Color)
end;

procedure TForm1.FormCreate(Sender: TObject);

 function CreateTrackBar(AHint: string; ATabOrder: integer): TTrackBar;
 begin
   Result := TTrackBar.Create(Self);
   with Result  do
   begin
     Parent := Self;
     Orientation := trVertical;
     Align := alLeft;
     TickMarks := tmBoth;
     Width := 40;
     Max := 255;
     Position := 255;
     Frequency := 5;
     PageSize := 51;
     ShowHint := True;
     Hint := AHint;
     TabOrder := ATabOrder;
     OnChange := OnShow
   end
 end;

begin // FormShow
 tbB := CreateTrackBar("Blue", 2);
 tbG := CreateTrackBar("Green", 1);
 tbR := CreateTrackBar("Red", 0);
 Panel := TPanel.Create(Self);
 Panel.Parent := Self;
 Panel.Align := alClient;
 Panel.Caption := ""
end;

end.

Теперь главное - к чему все это.

Панель отображает смесь трех основных цветов - R, G, B. Яркость каждого их этих цветов в их смеси задается соотвествующим ползунком.

Но можно сказать и иначе - панель отображает смесь ДВУХ (а не трех) цветов. Один из них - это основной цвет, задаваемый любым ползунком. А второй из них - это НЕ основной цвет, а смесь двух оставшихся основных цветов в заданной их ползунками пропорции.

Таким образом, наблюдаем смешение любых цветов и их оттенков в модели RGB. Причем обратите внимание на Caption: clYellow + clBlue = clWhite.

Но не clGreen. В полном соответствии с физикой...
:o)


 
XcCCC   (2009-08-16 18:10) [51]

[21]
да всего ничего - подбор нужного цвета для покраски.
И иногда обратная задача есть цвет (вещь перед перед монитор)
задача получении такого же цвета из имеющихся банок (тут оттенки
будут задаватся с помощью частей основных красок)
моник откалиброван есно,
после компа сначала будет проводится опыты на соотвествие угаданного)


 
Inovet ©   (2009-08-16 21:14) [52]

> [51] XcCCC   (16.08.09 18:10)

"Где солнечный рисуя свет / живёт художник и поэт..."
(с) см в ветке о поэзии.


 
Омлет   (2009-08-18 20:09) [53]

http://www.efg2.com/Lab/Graphics/Colors/ColorMix.htm


 
Inovet ©   (2009-08-18 21:45) [54]

Кстати, у мужчит чаще чем у женщин встречается врождённое нарушение цветоощущения, слышал, что чуть ли не у 10% в большей или меньшей степени. Это определяется у окулиста по специальным рисункам.


 
Inovet ©   (2009-08-18 22:23) [55]

> [54] Inovet ©   (18.08.09 21:45)
> по специальным рисункам.

http://sla-avia.narod.ru/rabkin.jpg

Как я понял 1 и 3 столбцы оригинальные, 2 и 4 уже переделаны по цвету, т.е. смотреть надо на оригинал. Не знаю насколько правильно с монитора их смотреть.


 
XcCCC   (2009-08-21 10:58) [56]

http://www.efg2.com/Lab/Graphics/Colors/ScreenColorMixCMY.gif

это кажись верное представление


 
Inovet ©   (2009-08-21 11:15) [57]

> [56] XcCCC   (21.08.09 10:58)
> http://www.efg2.com/Lab/Graphics/Colors/ScreenColorMixCMY.gif
>
> это кажись верное представление

Что верное? Это вычитание из белого.


 
Dimka Maslov ©   (2009-08-21 11:54) [58]


> Dimka Maslov ©   (12.08.09 18:29) [12]


Написано неправильно. На самом деле надо преобразовывать цвет в цветовое простанство HSL (HSB). Вот тогда смешивание цветов  будет выражаться как

H = (H1 + H2 + 1.0) / 2.0;
if H > 1 then H := H - 1;
S = (S1 + S2) / 2.0
L = (L1 + L2) / 2.0



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

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

Наверх




Память: 0.59 MB
Время: 0.015 c
2-1251290575
Kusma
2009-08-26 16:42
2009.10.25
Как выйти из программы


3-1228583788
FUV
2008-12-06 20:16
2009.10.25
Индекс для вычисляемого поля


15-1250350837
Внук
2009-08-15 19:40
2009.10.25
Я сделал это!


2-1251091182
Interesting
2009-08-24 09:19
2009.10.25
Как возвести число в степень?


4-1220075003
DAS
2008-08-30 09:43
2009.10.25
Как сохранить Html страницу в *.txt зная его URL