Существует ли алгоритм для цвета, смешивающегося, который работает как смешивание реальных цветов?

// this is messed up, and no one actually knows how it works anymore...
59
задан Tom Pažourek 15 April 2018 в 18:06
поделиться

2 ответа

правильный ответ - НЕТ, потому что не существует правильной рабочей модели того, как «смешивание цветов в реальном мире» действительно работает . Это слишком сложно и условно, и совсем не похоже на простой красно-сине-желтый материал, который мы изучали в школе (на самом деле для решения этого вопроса требуется вся химия и много физики и биологии).

Однако, упрощенный ответ: ДА, используйте вычитающее смешивание вместо Аддитивное смешивание.

Смешивание цветов, которому мы научились в начальной школе, основано на комбинациях пигментов, которые являются формой субтрактивное смешение цветов (очень упрощенно). То есть, чем больше цветов мы складываем вместе, тем темнее становится, потому что каждый пигмент вычитает немного больше света.

С другой стороны, почти все компьютерные цветовые схемы аддитивны в том смысле, что они основаны на объединении световых волн (очень упрощенно), поэтому они становятся ярче, потому что каждый цвет добавляет немного больше света.

Схема RGB + - это в некотором роде аддитивное дополнение к схеме вычитания, которую мы изучили в большинстве начальных школ США (то есть RBY-). Однако они не совпадают в точности, и может быть трудно преобразовать между ними (сейчас исследуем ...)


Хорошо, если вы просто хотите переключиться с аддитивных комбинаций в RGB на вычитающие, вы можете использовать следующий обратный -байсан формула для объединения двух цветов:

NewColor.R = (Color1.R * Color2.R)/255
NewColor.G = (Color1.G * Color2.G)/255
NewColor.B = (Color1.B * Color2.B)/255

Регулировка разницы в хроматических полюсах (от G к Y, затем обратно к G) намного сложнее ...


Было указано, что это дает черный цвет для пример проблемы, и технически это правильно для истинной субтрактивной системы, однако, если вы хотите более разбавляющую / вычитающую систему, вы можете попробовать это вместо этого:

NewColor.R = 255 - SQRT(((255-Color1.R)^2 + (255-Color2.R)^2)/2)
NewColor.G = 255 - SQRT(((255-Color1.G)^2 + (255-Color2.G)^2)/2)
NewColor.B = 255 - SQRT(((255-Color1.B)^2 + (255-Color2.B)^2)/2)

Это дает темно-серый цвет вместо черного. Но чтобы получить желтый или что-то похожее, вам все равно придется исправить проблему выравнивания полюсов цветовой схемы.

25
ответ дан 24 November 2019 в 18:34
поделиться

есть две разные возможности комбинирования цветов:

  1. аддитивное смешивание (например, RGB)

  2. субтрактивное смешивание (например, CMYK)

Таким образом, при субтрактивном смешивании цветов результат - то, что вы ожидали, но синего нет, вместо него есть голубой:

Желтый + голубой = зеленый

В общем, субтрактивное смешение цветов просто «убирает» (фильтрует) белый, в то время как аддитивное смешение цветов сложение от черного. (базовые цвета вычитания противоположны аддитивным: красный -> голубой; зеленый -> пурпурный; синий -> желтый)

Итак, если вы начнете с белого экрана, применяя фильтры:

min (белый (255,255,255), желтый ( 255,255,0), голубой (0,255,255)) = зеленый (0,255,0)

5
ответ дан 24 November 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: