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

Вниз

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

 
XcCCC   (2009-08-11 00:16) [0]

Задача написать прогу сложения цвета.
Какие цвета получаются при сложении двух цветов.
Позже можно каждый цвет в частях указывать для получения оттенков
color1:=clRed;
color2:=clYellow;
Panel1.Color:=color1+color2; ????

такой алгоритм?


 
М. Береговой   (2009-08-11 00:20) [1]

Думаю, надо цвета представлять в виде типа hex ( пример светло-серого #EEEEEE), а потом складывать или вычитать RGB части...


 
XcCCC   (2009-08-11 00:27) [2]

хм тогда может представлять цвета в виде трех переменных
colorR:= (byte)
colorG:= (byte)
colorB:= (byte)
константы на каждый цвет посмотреть в фотошопе
слаживать это как, а если переполнение что делать?
colorR1+colorR2:= 200+100= 300>255


 
boa_kaa ©   (2009-08-11 01:02) [3]


> XcCCC   (11.08.09 00:16)  

ты не поверишь, но первая же ссылка
http://www.google.ru/search?q=%D1%81%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:ru:unofficial&client=firefox-a


 
Inovet ©   (2009-08-11 01:12) [4]

Совсем недавно
http://delphimaster.net/view/2-1249460930/


 
Ega23 ©   (2009-08-11 02:01) [5]

Было дано очень давно кем-то, кем - не помню (тогда ещё копирайт не ставил).
ЕМНИП, 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;


Функция выдаёт контрастный цвет (надо было для вывода текста на выделенной области)


 
XcCCC   (2009-08-11 02:11) [6]

спасибо! а я не знал как сформулировать запрос яндекху
градент не нужен


 
Inovet ©   (2009-08-11 07:19) [7]

> [6] XcCCC   (11.08.09 02:11)
> спасибо! а я не знал как сформулировать запрос яндекху
> градент не нужен

А в нём типа сложение цветов нет?


 
SPeller ©   (2009-08-11 08:38) [8]

пользуюсь gdi+ и нафик не надо знать как там эти цвета складываются :)


 
MsGuns ©   (2009-08-11 09:23) [9]

>Ega23 ©   (11.08.09 02:01) [5]

Вариант не без недостатков, как, впрочем и вариант Юры Зотова.
С месяцок назад решал ту же проблему - универсального алгоритма на все цвета и все мониторы и видеокарты не нашел. При  определенной комбинации фонта и кисти надпись почти не видна или не видна вовсе. Причем для кадого способа эти комбинации собственные :)


 
SPeller ©   (2009-08-11 09:50) [10]

Неплох вариант когда текст выводишь сначала черным, а потом, поверх, с небольшим смещением в 1 пиксель влева-вверх, белым цветом. Правда, это красивее получается на том же gdi+ с антиальязингом или сглаживанием.

ЗЫ: Попользовался им немного - желания возиться с gdi не осталось :)


 
Дмитрий С ©   (2009-08-12 18:22) [11]

Желтый с синим должен давать зеленый, не так то просто в ргб сложить два цвета


 
Dimka Maslov ©   (2009-08-12 18:29) [12]

Простое смешивание цветов:

1. Разложить цвета на компоненты R, G, B
2. Вычислить среднее арифметическое отдельных компонентов R, G, B для двух цветов
3. Записать компоненты в переменную ТСolor

Для системных цветов типа clWindowText необходимо сначала произвести преобраозвание в RGB.


 
Jeer ©   (2009-08-12 18:43) [13]

Зависит от модели смешивания - что мы смешивает на просвет или цвет
В модели RGB смешение аддитивное, т.е. цвет при смешивании осветляется.
Если хотим получить аналог смешения красок на реальной палитре, то надо перейти сначала в координаты CMY или CMYK, там смешать и вернуть отбратно в RBG для отображения ( смешение будет вычитающим в итоге )


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


>
> Простое смешивание цветов:
>
> 1. Разложить цвета на компоненты R, G, B
> 2. Вычислить среднее арифметическое отдельных компонентов
> R, G, B для двух цветов
> 3. Записать компоненты в переменную ТСolor
>
> Для системных цветов типа clWindowText необходимо сначала
> произвести преобраозвание в RGB.
>
>

желтый : 255.255.0
синий: 0.0.255
среднее: 127.127.127 - серый а не зеленый

про смик больше на правду похоже


 
XcCCC   (2009-08-15 01:02) [15]

вот откопал может кому пригодится

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;


 
DVM ©   (2009-08-15 01:14) [16]

Вот так побыстрее будет:

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;


 
Дмитрий С ©   (2009-08-15 06:28) [17]

<
> Вот так побыстрее будет:

Ну эт уже прозрачность. Кстати в винде, если полупрлзрачное окно синего цвета расположить над окном желтого цвета, то какой получиться?

> XcCCC   (15.08.09 01:02) [15]

это не дает правильного смешивания.


 
Anatoly Podgoretsky ©   (2009-08-15 10:37) [18]

> Дмитрий С  (15.08.2009 06:28:17)  [17]

> это не дает правильного смешивания.

Это он поиздевался.


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

> Дмитрий С ©   (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;

// OnShow, ComboBox1.OnChange, ComboBox2.OnChange, ComboBox3.OnChange
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;


 
Юрий Зотов ©   (2009-08-15 11:20) [20]

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

> Дмитрий С ©   (12.08.09 18:22) [11]
> Желтый с синим должен давать зеленый

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

Желтый - это красный с зеленым, поэтому желтый с синим - это красный с зеленым и синим. То есть - белый.

Кому приходилось настраивать сведение лучей в старых цветных телевизорах - тот знает.
:o)


 
Дмитрий С ©   (2009-08-15 11:33) [21]


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

Со школы помню, что не белый - точно. :)
Надо делать фотошопный эффект multiply в CMYKе, чтобы получить правильное смешение *цветов*, а не лучей.


 
TIF ©   (2009-08-15 11:38) [22]

> Желтый - это красный с зеленым, поэтому желтый с синим -
>  это красный с зеленым и синим. То есть - белый.

Зависит от кодировки... бррр ))) от цветовой модели то есть :)

Основные сведения о цвете
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: сравните картинки в русскоязычной версии статьи и англоязычной. Однако, даже тут умудрились различия сделать :)))


 
Anatoly Podgoretsky ©   (2009-08-15 11:43) [23]

> Юрий Зотов  (15.08.2009 11:20:20)  [20]

Глупо складывать цвета в RGB


 
Inovet ©   (2009-08-15 11:48) [24]

> [20] Юрий Зотов ©   (15.08.09 11:20)
> > Юрий Зотов ©   (15.08.09 10:51) [19]
>
> > Дмитрий С ©   (12.08.09 18:22) [11]
> > Желтый с синим должен давать зеленый
>
> Вдогонку - желтый с синим должен давать белый, а не зеленый.

Многие люди не понимают разницы между излучением и поглощением, но программистам вроде пора усвоить.


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

> Дмитрий С ©   (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. Отенки же этих цветов регулируются яркостью, но в пример я яркость вводить не стал, чтобы не загромождать его.

При желании можно раскопать в инете декодирование цветоразностного телевизионного сигнала в системе СЕКАМ, например. Там есть формула для восстановления яркостного сигнала , только я ее наизусть не помню. По этой формуле и надо вычислять яркость - тогда получим оттенки.


 
Inovet ©   (2009-08-15 11:50) [26]

> [21] Дмитрий С ©   (15.08.09 11:33)
>
> > Вдогонку - желтый с синим должен давать белый, а не зеленый.
>
> Со школы помню, что не белый - точно. :)

Плохо вас в ней учили. См выше.


 
Юрий Зотов ©   (2009-08-15 11:52) [27]

> Anatoly Podgoretsky ©   (15.08.09 11:43) [23]
> Глупо складывать цвета в RGB

Не более глупо, чем не понимать, что под словом "складывать" в топике подразумевается "смешивать". А смешивать цвета вряд ли глупо, даже и в RGB.


 
Юрий Зотов ©   (2009-08-15 11:54) [28]

> TIF ©   (15.08.09 11:38) [22]
> Зависит от кодировки... бррр ))) от цветовой модели то есть

Совершенно верно. Однако, читать надо внимательнее - я отвечал на [11], а там цветовая модель указана.


 
Anatoly Podgoretsky ©   (2009-08-15 11:56) [29]

> Юрий Зотов  (15.08.2009 11:49:25)  [25]

А не восстановление Зеленого из яркостного.


 
Юрий Зотов ©   (2009-08-15 11:59) [30]

> Inovet ©   (15.08.09 11:48) [24]
> Многие люди не понимают разницы между излучением и поглощением

Если я правильно понял, в контексте топика Вы говорите о дополнительных цветах?


 
Юрий Зотов ©   (2009-08-15 12:02) [31]

> Anatoly Podgoretsky ©   (15.08.09 11:56) [29]
> А не восстановление Зеленого из яркостного.

Вроде бы, в [25] я говорил о восстановлении яркостного сигнала из цветовых (точнее, из цветоразностных). Но не наоборот.


 
Anatoly Podgoretsky ©   (2009-08-15 12:18) [32]

> Юрий Зотов  (15.08.2009 12:02:31)  [31]

В [25] Ты говорил про декодирование в СЕКАМ, в СЕКАМ восстанавливается зеленый, формулу можно найти в справочниках. Вот кодирование другое дело, формулы приводились не раз на наших форумах Y = k1*r + k2*g + k3*b. В СЕКАМ же передается Y+R+B воостанавливается зеленый, путем сложения на матрице, обычно резистивной.

ЗЫ: моя первая специальность радиомеханик.


 
vrem   (2009-08-15 12:23) [33]

но всётаки - хорошо ли это - сложение цветов? :)


 
Inovet ©   (2009-08-15 12:33) [34]

> [30] Юрий Зотов ©   (15.08.09 11:59)
> > Inovet ©   (15.08.09 11:48) [24]
> > Многие люди не понимают разницы между излучением и поглощением
>
> Если я правильно понял, в контексте топика Вы говорите о
> дополнительных цветах?

Я это не Ваи - тем у кого путаница. Общие физические принцыпы надо понимать.

Излучение. Надеюсь все знают спектр излучения какой звезды вспринимается человеческим зрением как белый. Под трёхкомпонентное цветовое зрение человека разработаны различные устройства-имитаторы этого спектра, хотя на самом деле он и не совсем белый. Собаке не очень понравиться наш монитор, а некоторым рыбам больше понравится. Красный, зелёный, синий настроеные на наши рецепторы как по частоте, так и по интенсивности, дадут нам белый. RGB

Поглощение. Свет звезды отражаясь от "белого" листа бумаги полностью возвращается в видимом участке спектра. Если мы видим траву зелёной, значит она хорошо поглощает красный и синий. Таким образом можно на белом листе с помощью поглощения красками создать желаемую палитру. То же самое поглощение при прохождении света через вещество.  Это будет белый - красный = зелёный + синий = голубой (циан), белый - зелёный = красный + синий = пурпурный (магента), белый - синий = красный + зелёный = жёлтый. И по техническим причинам белый - красный - зелёный - синий = чёрный. CMYK.


 
TIF ©   (2009-08-15 12:34) [35]

> хорошо ли это - сложение цветов? :)

Смотря что с чем складывать и для чего, imho


 
DVM ©   (2009-08-15 12:38) [36]


> Дмитрий С ©   (15.08.09 06:28) [17]


> Ну эт уже прозрачность.

Мне кажется один хрен. Если в моей функции поставить Rate = 0.5 то выйдет смешение.


 
Юрий Зотов ©   (2009-08-15 12:40) [37]

> Anatoly Podgoretsky ©   (15.08.09 12:18) [32]
> в СЕКАМ восстанавливается зеленый

Посмотрел, освежил память. Согласен.


 
Inovet ©   (2009-08-15 12:41) [38]

> [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% остальное только по интенсивности.


 
Anatoly Podgoretsky ©   (2009-08-15 13:16) [39]

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

Можно и ЮЗ иногда уговорить :-)


 
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



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

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

Наверх




Память: 0.58 MB
Время: 0.02 c
2-1251020827
EXEcER
2009-08-23 13:47
2009.10.25
Рэндом в Label


2-1251840478
Германн
2009-09-02 01:27
2009.10.25
Странное какое-то AV


15-1250873584
blackman
2009-08-21 20:53
2009.10.25
Российский программист: ничего особенного


2-1251275225
TarenoKostanay
2009-08-26 12:27
2009.10.25
Task Bar


3-1201334641
mega
2008-01-26 11:04
2009.10.25
DirectMysqlObjects (TMySQLClient, TMysqlResult) + Jpeg