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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.057 c
2-1251206612
Дмитрий_
2009-08-25 17:23
2009.10.25
TStrngList.AddObject..?


2-1251882705
sanx
2009-09-02 13:11
2009.10.25
Получить от компилятора текущую дату в констатнту, как?


2-1251201731
Andy BitOff
2009-08-25 16:02
2009.10.25
Почему не срабатывает ShellExecute и чем это заменить?


2-1251155492
sanx
2009-08-25 03:11
2009.10.25
Реализация списка в многопоточном приложении


2-1251362876
Polkin
2009-08-27 12:47
2009.10.25
Наведение мыши в потомке TLabel





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский