Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/50: Рейтинг темы: голосов - 50, средняя оценка - 4.50
85 / 77 / 13
Регистрация: 03.09.2009
Сообщений: 346

Как смешать 4 RGB цвета?

30.01.2011, 00:58. Показов 9781. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если нарисовать сетку из чередующихся линий 4-х цветов и посмотреть на нее с некоторого удаления - она сливается в один цвет. Кто знает по какой формуле?

Вот этот метод дает неправильный результат, а других не нашел:
C#
1
2
3
4
5
6
7
 public static Color MixColors(Color c1, Color c2, Color c3, Color c4)
        {
            int _r = Convert.ToInt32((float)(c1.R + c2.R + c3.R + c4.R) / 4f);
            int _g = Convert.ToInt32((float)(c1.G + c2.G + c3.G + c4.G) / 4f);
            int _b = Convert.ToInt32((float)(c1.B + c2.B + c3.B + c4.B) / 4f);
            return Color.FromArgb(_r,_g,_b);
        }
Цифры для проверки:
с1 - (0, 255, 0)
с2 - (255, 91, 15)
с3 - (174, 15, 255)
с4 - (255, 240, 242)

при смешивании должен получится результат - (213,183,191)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.01.2011, 00:58
Ответы с готовыми решениями:

Смешать цвета
У меня есть ячейка таблица, скажем, красного цвета. Есть еще одна группы ячеек, выделенных желтым. Нужно сделать так, чтобы при пересечении...

Смешать два цвета RGBA, путем наложения одной на другую
Приветствую. Подскажите, пожалуйста, формулу альфа-смешивания цветов

Как записать RGB цвета в массив?
Здравствуйте, вот собственно код, нашел на форуме, выводит цвета нормально, но хочу записать эти цвета в массив, желательно в двоичном...

10
(Yellow_Duck)
 Аватар для MadMag
1261 / 130 / 15
Регистрация: 16.10.2008
Сообщений: 733
30.01.2011, 23:39
C++
1
2
3
4
5
6
7
8
9
10
11
12
TColor __fastcall MiddleColor( const TColor BegColor, const TColor EndColor, const int CurIndex = 50, const int TotIndex = 100 );
 {int C0 = ColorToRGB( BegColor );
  int C1 = ColorToRGB( EndColor );
  Byte R, G, B;
  R =       ( ( C0 >> 0x00 ) & 0x000000FF );
  R = R + ( ( ( C1 >> 0x00 ) & 0x000000FF ) - R ) * CurIndex / TotIndex;
  G =       ( ( C0 >> 0x08 ) & 0x000000FF );
  G = G + ( ( ( C1 >> 0x08 ) & 0x000000FF ) - G ) * CurIndex / TotIndex;
  B =       ( ( C0 >> 0x10 ) & 0x000000FF );
  B = B + ( ( ( C1 >> 0x10 ) & 0x000000FF ) - B ) * CurIndex / TotIndex;
  return( TColor( ( R << 0x00 ) | ( G << 0x08 ) | ( B << 0x10 ) ) );
 }
Ну, как бе без комментариев.

Добавлено через 12 минут
Я проверил, в данном примере, что вы написали, получается более темный цвет, согласно этой функции.
Видимо цвета нельзя так смешивать последовательно.
Получается (202, 167, 186).
0
 Аватар для lenin133
6 / 6 / 0
Регистрация: 24.11.2010
Сообщений: 25
31.01.2011, 10:29
Доброго времени суток

Цвета можно складывать по закону Грассмана.
Например:
Та=wa1*P1+wa2P2+wa3P3
Тв=wв1*P1+wв2P2+wв3P3

Та + Тв = (wa1 + wb1) * P1 + (wa2 + wb2) * P2 + (wa3 + wb3) * P3

но есть фишка, цветовое пространство RGB, наложено на длинны волн излучения с перекрытием (см. картинку1)
Если зафиксировать значение яркости для четырех цветов, предполагая. что источник один, а смешивается отражательная способность предмета, то можно получить:

rR + gG + bB = Const

rr = rA(r1 + r2 + r3 + r4)
gg = gA(g1 + g2 + g3 + g4)
bb = bA(b1 + b2 + b3 + b4)

rR + gG + bB = rrR + ggG + bbB

Множитель можно вынести за цвета, получив универсальную константу rgbC, которая уравновесит все:
rR + gG + bB = rgbC (R(r1 + r2 + r3 + r4) + G(g1 + g2 + g3 + g4) + B(b1 + b2 + b3 + b4))

В приведенном выше посте от MadMag, при сложении 2-х цветов
пример:
возьмем 4 числа 1, 2, 1, 2
если 1 + 2 + 1 + 2 = 6, и 6/4= 1,5
, то
(1 + 2 = 3) 3/2 = 1,5
(1,5 + 1 = 2,5) 2,5/2 = 1,25
(1,25 + 2 = 3,25) 3,25/2= 1,625

Как же сложить последовательно цвета, и сохранить яркость?
Если мы знаем, что значение цвета в RGB системе цветов, меняется от 0 до 255
то предполагаем минимальную яркость 0, а максимальную 3 * 255 = 765
мы можем нормировать значения, и использовать взвешенные коэффициенты:
берем последовательность 1, 2, 1, 2 допустим это R

(1/255)R1 + (2/255)R2 = (x/255)R12
-не получается чего-то
х = 3 и та-же фигня. , или нет...
(3/255)R12 + (1/255)R3 = (x/255)R123
x = 4
(4/255)R123 + (2/255)R4 = (x/255)R1234
x = 5
просто складывать тоже не дело, яркость суммируется

попробуем перемножить:
1/255*2/255= (3,0757400999615532487504805843906e-5)
* 1/255 = 1,2061725882202169602943061115257e-7
* 2/255 = 9,460177162511505570935734208045e-10
тоже фигня какая то

попробуем приводить к единице
R1 + R2 +... =1
тогда
(1 + 2)x = 1
x = 1/3
(1+2)x/2= 0.5

(0.5 + 1)x = 1
x = 0,66666666666666666666666666666667
(0.5+1)x/2 = 0.5

(0.5+2)x = 1
x = 0.4
(0.5+2)x/2 = 0.5

Мы получили три числа, о чем они непонятно:
1/3
0,66666666666666666666666666666667
0.4

если использовать как коэффициент, то получим:
(1+2)*1/3=1
(1+1)*2/3=4/3 = 1(1/3)
(4/3+2)*0,4= 1(1/3)

их сумма 1,4
среднее 0,46666666666666666666666666666667

а если
(1 + 2)x = 1
x = 1/3
(1+2)x/2= 0.5
2 * (1/3) + 1 = 5/3 = 1,6666666666666666666666666666667

(5/3 + 1)х = 1
х = 3/8
(5/3 +1)х/2 = 1(1/3)
1 * (3/8) + 5/3 = 9/24 + 40/24 = 49/24 = 2 (1/24)

Если посмотреть для последовательности 1,2,1,2 описательную статистику, то получим:

Mean 1,5
Standard Error 0,288675135
Median 1,5
Mode 1
Standard Deviation 0,577350269
Sample Variance 0,333333333
Kurtosis -6
Skewness 0
Range 1
Minimum 1
Maximum 2
Sum 6
Count 4
Largest(1) 2
Smallest(1) 1
Confidence Level(95,0%) 0,918693116

и сравним ее с последовательностью 1,2,1
Mean 1,333333333
Standard Error 0,333333333
Median 1
Mode 1
Standard Deviation 0,577350269
Sample Variance 0,333333333
Kurtosis #DIV/0!
Skewness 1,732050808
Range 1
Minimum 1
Maximum 2
Sum 4
Count 3
Largest(1) 2
Smallest(1) 1
Confidence Level(95,0%) 1,434217577

то ничегошеньки непонятно. Короче я загнался, может, чтото из рассуждений пригодится
0
85 / 77 / 13
Регистрация: 03.09.2009
Сообщений: 346
02.02.2011, 01:57  [ТС]
Вроде бы в первых двух постах сложение как раз по закону Грассмана, но результат темнее.

В то же время я взял в фотошопе нарисовал многократную последовательность тонких линий 4-х цветов. Взял, уменьшил масштаб так, чтобы картинка слилась в однотонный цвет, сделал скриншот и посмотрел полученный RGB-цвет (см. пост 1). На глаз соответствие хорошее, но как было получено это значение не совсем понятно.

Подозреваю, что при смешении как-то нужно учитывать различное ощущение яркости между R, G и B.
Т.е. (0,0,255) кажется темнее, чем (0,255,0), хотя по правилам они одинаковы по яркости.
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
02.02.2011, 11:35
Ключевой момент
взял в фотошопе нарисовал
и
уменьшил масштаб
, тут очень важно как было нарисовано, если линии были одинаковой толщины и имели "чистый" цвет, то результат получится вполне предсказуемый: линии Название: test1.png
Просмотров: 1415

Размер: 113 байт и уменьшенный вариант Название: test2.png
Просмотров: 1423

Размер: 79 байт, как видно, в результате получился цвет (171, 150, 128), что полностью соответствует формуле расчета из первого поста.

Подозреваю, что при смешении как-то нужно учитывать различное ощущение яркости между R, G и B.
Т.е. (0,0,255) кажется темнее, чем (0,255,0), хотя по правилам они одинаковы по яркости.
Яркость у них не одинаковая, только интенсивность, а ощущения правильные. Наши глаза чувствительнее всего к зеленому.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
03.02.2011, 07:44
Кто объяснит такую загадку: цвет 0000FF на глаз темнее, чем 00FF00, но FFFFFF на глаз белый?
0
 Аватар для lenin133
6 / 6 / 0
Регистрация: 24.11.2010
Сообщений: 25
03.02.2011, 08:49
Зачем смешивать восприятие и физические величины. Ощущение света. вообще субъективно, колбочки палочки, и прочие биологические вещи. Инфракрасное, и ультрафиолетовое излучение, вообще не видно, однако и интенсивность, и яркость у них есть.
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
03.02.2011, 10:10
taras atavin, это не загадка, а аддитивная цветовая модель.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.02.2011, 08:39
Про аддитивность я знаю. Мне не ясно, почему при при смешении основных цветов, воспринимаемых, как цвета различной яркости результирующий цвет не имеет зеленоватого оттенка.
0
I ♥ C#
 Аватар для Delog
470 / 262 / 25
Регистрация: 07.05.2010
Сообщений: 567
04.02.2011, 11:40
Шестнадцатеричная RGB-запись цвета не имеет ничего общего с длинами волн и их интенсивностью воздействия на определенные колбочки глаза человека. Ну то есть, связь-то конечно есть, но она не такая линейная и очевидная, как FF0000 + 00FF00 + 0000FF = FFFFFF.

Ссылки по теме:
http://ru.wikipedia.org/wiki/Зрение_человека
http://ru.wikipedia.org/wiki/Колбочки
http://ru.wikipedia.org/wiki/Метамерия_(цвет)
http://ru.wikipedia.org/wiki/LAB
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
04.02.2011, 12:02
Еще стоит глянуть:
http://ru.wikipedia.org/wiki/Цвет
http://ru.wikipedia.org/wiki/П... ятия_цвета
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2011, 12:02
Помогаю со студенческими работами здесь

Как в TChart добавить цвета RGB
Как в TChart добавить цвета RGB? Например: with Series1 do begin Add(R1, 'Раздел 1',#FFBADE); Add(R2, 'Раздел...

Как в DBChart добавить цвета RGB?
Как в DBChart добавить цвета RGB? Делаю так: with Series1 do begin Add(R1, 'Раздел 1',rgb(49,47,138)); Add(R2,...

Как отсканировать Picturebox и получить цвета по RGB?
Помогите пожалуйста. Через API умею, но занимает неприемлимое время.Заранее спасибо.

Как выделить определенный диапазон цвета RGB на картинке bmp?
всем доброго времени суток!помогите,пожалуйста, в написании кода.есть картинка bmp. Надо разложить ее на цвета rgb. определить диапазон...

Как переделать код чтоб использовать RGB цвета, а не стандартные?
Как переделать код чтоб использовать RGB цвета, а не стандартные? Dim mygraphics As Graphics = MyBase.CreateGraphics Dim...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru