-
Задача написать прогу сложения цвета. Какие цвета получаются при сложении двух цветов. Позже можно каждый цвет в частях указывать для получения оттенков color1:=clRed;
color2:=clYellow;
Panel1.Color:=color1+color2; ???? такой алгоритм?
-
Думаю, надо цвета представлять в виде типа hex ( пример светло-серого #EEEEEE), а потом складывать или вычитать RGB части...
-
хм тогда может представлять цвета в виде трех переменных colorR:= (byte) colorG:= (byte) colorB:= (byte) константы на каждый цвет посмотреть в фотошопе слаживать это как, а если переполнение что делать? colorR1+colorR2:= 200+100= 300>255
-
-
-
Было дано очень давно кем-то, кем - не помню (тогда ещё копирайт не ставил). ЕМНИП, Digitman © поделился. function ContrastColor(AColor: TColor): TColor;
const
TolerSq = 16 * 16;
begin
if Sqr(GetRValue(AColor) - $80) + Sqr(GetGValue(AColor) - $80)
+ Sqr(GetBValue(AColor) - $80) < TolerSq then
Result := (AColor + $7F7F7F) and $FFFFFF
else
Result := AColor xor $FFFFFF;
end; Функция выдаёт контрастный цвет (надо было для вывода текста на выделенной области)
-
спасибо! а я не знал как сформулировать запрос яндекху градент не нужен
-
> [6] XcCCC (11.08.09 02:11) > спасибо! а я не знал как сформулировать запрос яндекху > градент не нужен
А в нём типа сложение цветов нет?
-
пользуюсь gdi+ и нафик не надо знать как там эти цвета складываются :)
-
>Ega23 © (11.08.09 02:01) [5]
Вариант не без недостатков, как, впрочем и вариант Юры Зотова. С месяцок назад решал ту же проблему - универсального алгоритма на все цвета и все мониторы и видеокарты не нашел. При определенной комбинации фонта и кисти надпись почти не видна или не видна вовсе. Причем для кадого способа эти комбинации собственные :)
-
Неплох вариант когда текст выводишь сначала черным, а потом, поверх, с небольшим смещением в 1 пиксель влева-вверх, белым цветом. Правда, это красивее получается на том же gdi+ с антиальязингом или сглаживанием.
ЗЫ: Попользовался им немного - желания возиться с gdi не осталось :)
-
Желтый с синим должен давать зеленый, не так то просто в ргб сложить два цвета
-
Простое смешивание цветов:
1. Разложить цвета на компоненты R, G, B 2. Вычислить среднее арифметическое отдельных компонентов R, G, B для двух цветов 3. Записать компоненты в переменную ТСolor
Для системных цветов типа clWindowText необходимо сначала произвести преобраозвание в RGB.
-
Зависит от модели смешивания - что мы смешивает на просвет или цвет В модели RGB смешение аддитивное, т.е. цвет при смешивании осветляется. Если хотим получить аналог смешения красок на реальной палитре, то надо перейти сначала в координаты CMY или CMYK, там смешать и вернуть отбратно в RBG для отображения ( смешение будет вычитающим в итоге )
-
> > Простое смешивание цветов: > > 1. Разложить цвета на компоненты R, G, B > 2. Вычислить среднее арифметическое отдельных компонентов > R, G, B для двух цветов > 3. Записать компоненты в переменную ТСolor > > Для системных цветов типа clWindowText необходимо сначала > произвести преобраозвание в RGB. > >
желтый : 255.255.0 синий: 0.0.255 среднее: 127.127.127 - серый а не зеленый
про смик больше на правду похоже
-
вот откопал может кому пригодится
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;
-
Вот так побыстрее будет:
function MixerColors(FromColor, ToColor: TColor; Rate: Single): TColor;
var
ra, rb: byte;
begin
RA := round(Rate * 255);
RB := 255 - RA;
result := (((Lo(FromColor) * RA + Lo(ToColor) * RB) shr 8) or
(((Lo(FromColor shr 8) * RA + Lo(ToColor shr 8) * RB) shr 8) shl 8) or
(((Lo(FromColor shr 16) * RA + Lo(ToColor shr 16) * RB) shr 8) shl 16));
end;
-
< > Вот так побыстрее будет:
Ну эт уже прозрачность. Кстати в винде, если полупрлзрачное окно синего цвета расположить над окном желтого цвета, то какой получиться?
> XcCCC (15.08.09 01:02) [15]
это не дает правильного смешивания.
-
> Дмитрий С (15.08.2009 06:28:17) [17]
> это не дает правильного смешивания.
Это он поиздевался.
-
> Дмитрий С © (12.08.09 18:22) [11] > Желтый с синим должен давать зеленый, не так то просто в > ргб сложить два цвета Очень просто. На форме 3 комбобокса с DropDownList = (Красный, Зеленый, Сииний). Назначить им обработчик OnChange, а форме - обработчик OnShow. Код не оптимизировал и лишние локальные переменные не убирал специально - чтобы суть была понятнее и чтобы все происходящее можно было посмотреть отладчиком.
uses
Math;
function MixColors(Color1, Color2: cardinal): cardinal; overload;
var
R, G, B : byte;
begin
R := Min(GetRValue(Color1) + GetRValue(Color2), 255);
G := Min(GetGValue(Color1) + GetGValue(Color2), 255);
B := Min(GetBValue(Color1) + GetBValue(Color2), 255);
Result := RGB(R, G, B)
end;
function MixColors(Color1, Color2, Color3: cardinal): cardinal; overload;
var
C: cardinal;
begin
C := MixColors(Color1, Color2);
Result := MixColors(C, Color3)
end;
procedure TForm1.ChangeColor(Sender: TObject);
var
Color1, Color2, Color3: cardinal;
begin
Color1 := $FF shl (ComboBox1.ItemIndex * 8);
Color2 := $FF shl (ComboBox2.ItemIndex * 8);
Color3 := $FF shl (ComboBox3.ItemIndex * 8);
Color := MixColors(Color1, Color2, Color3)
end;
-
> Юрий Зотов © (15.08.09 10:51) [19]
> Дмитрий С © (12.08.09 18:22) [11] > Желтый с синим должен давать зеленый
Вдогонку - желтый с синим должен давать белый, а не зеленый.
Желтый - это красный с зеленым, поэтому желтый с синим - это красный с зеленым и синим. То есть - белый.
Кому приходилось настраивать сведение лучей в старых цветных телевизорах - тот знает. :o)
-
> Вдогонку - желтый с синим должен давать белый, а не зеленый. >
Со школы помню, что не белый - точно. :) Надо делать фотошопный эффект multiply в CMYKе, чтобы получить правильное смешение *цветов*, а не лучей.
-
> Желтый - это красный с зеленым, поэтому желтый с синим - > это красный с зеленым и синим. То есть - белый.
Зависит от кодировки... бррр ))) от цветовой модели то есть :)
Основные сведения о цвете help.adobe.com/ru_RU/Photoshop/11.0/WSECCD001A-4989-4451-A752-63D5EF9D5619a.html Understanding color help.adobe.com/en_US/Photoshop/11.0/WSECCD001A-4989-4451-A752-63D5EF9D5619a.html
PS: сравните картинки в русскоязычной версии статьи и англоязычной. Однако, даже тут умудрились различия сделать :)))
-
> Юрий Зотов (15.08.2009 11:20:20) [20]
Глупо складывать цвета в RGB
-
> [20] Юрий Зотов © (15.08.09 11:20) > > Юрий Зотов © (15.08.09 10:51) [19] > > > Дмитрий С © (12.08.09 18:22) [11] > > Желтый с синим должен давать зеленый > > Вдогонку - желтый с синим должен давать белый, а не зеленый.
Многие люди не понимают разницы между излучением и поглощением, но программистам вроде пора усвоить.
-
> Дмитрий С © (12.08.09 18:22) [11] > ... в ргб ...
> Дмитрий С © (15.08.09 11:33) [21] > ... в CMYKе ...
Как понять тебя, Саид?
В [11] об RGB говорилось - на [11] я и отвечал. А в RGB желтый с синим дает белый, это совершенно точно. Любой древний телевизионщик подтвердит.
И пример дает то же самое. Он строго в RGB и работает, правильно выдает все 7 возможных в RGB цветов: red, yellow, green, cyan, blue, magenta, white. Отенки же этих цветов регулируются яркостью, но в пример я яркость вводить не стал, чтобы не загромождать его.
При желании можно раскопать в инете декодирование цветоразностного телевизионного сигнала в системе СЕКАМ, например. Там есть формула для восстановления яркостного сигнала , только я ее наизусть не помню. По этой формуле и надо вычислять яркость - тогда получим оттенки.
-
> [21] Дмитрий С © (15.08.09 11:33) > > > Вдогонку - желтый с синим должен давать белый, а не зеленый. > > Со школы помню, что не белый - точно. :)
Плохо вас в ней учили. См выше.
-
> Anatoly Podgoretsky © (15.08.09 11:43) [23] > Глупо складывать цвета в RGB
Не более глупо, чем не понимать, что под словом "складывать" в топике подразумевается "смешивать". А смешивать цвета вряд ли глупо, даже и в RGB.
-
> TIF © (15.08.09 11:38) [22] > Зависит от кодировки... бррр ))) от цветовой модели то есть
Совершенно верно. Однако, читать надо внимательнее - я отвечал на [11], а там цветовая модель указана.
-
> Юрий Зотов (15.08.2009 11:49:25) [25]
А не восстановление Зеленого из яркостного.
-
> Inovet © (15.08.09 11:48) [24] > Многие люди не понимают разницы между излучением и поглощением
Если я правильно понял, в контексте топика Вы говорите о дополнительных цветах?
-
> Anatoly Podgoretsky © (15.08.09 11:56) [29] > А не восстановление Зеленого из яркостного.
Вроде бы, в [25] я говорил о восстановлении яркостного сигнала из цветовых (точнее, из цветоразностных). Но не наоборот.
-
> Юрий Зотов (15.08.2009 12:02:31) [31]
В [25] Ты говорил про декодирование в СЕКАМ, в СЕКАМ восстанавливается зеленый, формулу можно найти в справочниках. Вот кодирование другое дело, формулы приводились не раз на наших форумах Y = k1*r + k2*g + k3*b. В СЕКАМ же передается Y+R+B воостанавливается зеленый, путем сложения на матрице, обычно резистивной.
ЗЫ: моя первая специальность радиомеханик.
-
но всётаки - хорошо ли это - сложение цветов? :)
-
> [30] Юрий Зотов © (15.08.09 11:59) > > Inovet © (15.08.09 11:48) [24] > > Многие люди не понимают разницы между излучением и поглощением > > Если я правильно понял, в контексте топика Вы говорите о > дополнительных цветах?
Я это не Ваи - тем у кого путаница. Общие физические принцыпы надо понимать.
Излучение. Надеюсь все знают спектр излучения какой звезды вспринимается человеческим зрением как белый. Под трёхкомпонентное цветовое зрение человека разработаны различные устройства-имитаторы этого спектра, хотя на самом деле он и не совсем белый. Собаке не очень понравиться наш монитор, а некоторым рыбам больше понравится. Красный, зелёный, синий настроеные на наши рецепторы как по частоте, так и по интенсивности, дадут нам белый. RGB
Поглощение. Свет звезды отражаясь от "белого" листа бумаги полностью возвращается в видимом участке спектра. Если мы видим траву зелёной, значит она хорошо поглощает красный и синий. Таким образом можно на белом листе с помощью поглощения красками создать желаемую палитру. То же самое поглощение при прохождении света через вещество. Это будет белый - красный = зелёный + синий = голубой (циан), белый - зелёный = красный + синий = пурпурный (магента), белый - синий = красный + зелёный = жёлтый. И по техническим причинам белый - красный - зелёный - синий = чёрный. CMYK.
-
> хорошо ли это - сложение цветов? :)
Смотря что с чем складывать и для чего, imho
-
> Дмитрий С © (15.08.09 06:28) [17]
> Ну эт уже прозрачность.
Мне кажется один хрен. Если в моей функции поставить Rate = 0.5 то выйдет смешение.
-
> Anatoly Podgoretsky © (15.08.09 12:18) [32] > в СЕКАМ восстанавливается зеленый
Посмотрел, освежил память. Согласен.
-
> [32] Anatoly Podgoretsky © (15.08.09 12:18) > > Юрий Зотов (15.08.2009 12:02:31) [31] > > В [25] Ты говорил про декодирование в СЕКАМ, в СЕКАМ восстанавливается > зеленый, формулу можно найти в справочниках. Вот кодирование > другое дело, формулы приводились не раз на наших форумах > Y = k1*r + k2*g + k3*b. В СЕКАМ же передается Y+R+B воостанавливается > зеленый, путем сложения на матрице, обычно резистивной. > > ЗЫ: моя первая специальность радиомеханик.
Ну это всё извращения ради впихивания в полосу канала и совместимости с чёрнобелыми приёмниками, одна причина. Другая, глаз воспринимает цветовыми рецепторами около 20% остальное только по интенсивности.
-
> Юрий Зотов (15.08.2009 12:40:37) [37]
Можно и ЮЗ иногда уговорить :-)
-
[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
-
> Юрий Зотов © (15.08.09 12:40) [37]
А ты реально не понимаешь что я хочу сказать или притворяешься? Возьми два прозрачных цветных стекла. Синее или Желтое. совмести и посмотри на просвет. Какой получится? Белый?
-
> Желтый с синим дает серый по функции > > 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; > > что скорее так и есть
Что тебе нужно то?
-
Вот слегка модифицированный пример - введены оттенки цветов (то есть, яркость). На форму дополнительно кинуть 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;
-
Дмитрий С © наверно он имеет в виду не чисто белый, а зеленовато-белый, яркий, в р-г-б же одинаковые значения сразу всех каналов р, г, б задают оттенки серого
*летают. но низэнько-низэнько :))
-
Чуть мозг не взорвал. Голубой : 00ffff (не синий блин) Желтый: ffff00 после обычного GetMixColor чуть выше приведеного действительно дает зеленый оттенок.
-
> Юрий Зотов © (15.08.09 13:33) [43]
я прекрасно представляю как образуются цвета на экране. Причем тут смешиваение тоды?
-
> XcCCC (15.08.09 13:26) [40] > Дмитрий С © (15.08.09 13:32) [42]
1. Читайте [24] и [34]. Краска и стекло поглощают, а монитор излучает. Поймите разницу.
Желтая краска (стекло). Поглощают синий, остаются красный и зеленый. Синяя краска (стекло). Поглощают красный и зеленый, остается синий.
В итоге - если поглощение 100%-ное, то не останется ничего и получим черный. Но в реальности 100%-ного поглощения не бывает, поэтому получаем не черный, а различные оттенки.
Далее. Если реальные (то есть, не 100%-ные) поглощения красного, зеленого и синего идеально одинаковы, то это будет серый цвет (что и наблюдаем в [40]). То есть, именно белый, только с пониженной яркостью.
Если же поглощения красного, зеленого и синего неодинаковые (что в реальности и бывает), то можем получить оттенок любого цвета. Например, очень светлое желтое стекло с очень темным синим стеклом дадут цвет, который глаз воспримет, как все равно синий. А если стекла в сумме поглощают больше синего и красного, то получим как раз зеленый. Да и вообще можем получить любой цвет - все зависит от свойств стекол.
2. Воспроизведите пример с модификацией [43] и подвигайте ползунок яркости. Если останутся вопросы, замените этот ползунок тремя - чтобы регулировалась не общая яркость, а яркость каждого цвета отдельно. Подвигайте ползунки - все увидите сами.
==============
Пример точно воспроизводит смешение цветов в RGB-модели. С некоторой дискретностью, разумеется - потому что в один байт (цвет) нельзя записать дробное значение.
-
> Юрий Зотов © (15.08.09 14:10) [47]
Нагляднее будет моргать очень быстро. Красный/Зеленый/Красный/Зеленый/... а казаться будет что Желтый.
-
> XcCCC (15.08.2009 13:26:40) [40]
А ты по CMYK смешивай краски в банке
-
Дабы все-таки взлетел... :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
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 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)
-
[21] да всего ничего - подбор нужного цвета для покраски. И иногда обратная задача есть цвет (вещь перед перед монитор) задача получении такого же цвета из имеющихся банок (тут оттенки будут задаватся с помощью частей основных красок) моник откалиброван есно, после компа сначала будет проводится опыты на соотвествие угаданного)
-
> [51] XcCCC (16.08.09 18:10)
"Где солнечный рисуя свет / живёт художник и поэт..." (с) см в ветке о поэзии.
-
-
Кстати, у мужчит чаще чем у женщин встречается врождённое нарушение цветоощущения, слышал, что чуть ли не у 10% в большей или меньшей степени. Это определяется у окулиста по специальным рисункам.
-
> [54] Inovet © (18.08.09 21:45) > по специальным рисункам. http://sla-avia.narod.ru/rabkin.jpgКак я понял 1 и 3 столбцы оригинальные, 2 и 4 уже переделаны по цвету, т.е. смотреть надо на оригинал. Не знаю насколько правильно с монитора их смотреть.
-
-
-
> 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
|