2015-03-01 7 views
1

Я попытаюсь объяснить, на мой вопрос с примером:Вычитание цвета

  1. Допустим, у нас есть фон окрашен в оттенок красного (легко узнать - выбора цвета)
  2. Существует полу -прозрачный элемент спереди. Он окрашен в синий цвет, но кажется фиолетовым.
  3. Снова получающийся фиолетовый оттенок легко найти, но есть ли способ найти/вычислить полупрозрачный синий оттенок?

Дано: RGB (100,0,0) + х = RGB (100,0,100)

Найдено: х = RGBA (0,0,100,0.5)


Мой реальный случай:

фона: RGB (147,150,72), Element RGB (44,100,62)

background foreground


Это частично решается в этом вопросе для единственного случая белого фона, я на самом деле ищу более общее решение. Я попытался адаптировать javascript-код, но я не совсем понимаю, как это делается, или если общее решение даже возможно. Я мог бы сам закодировать его, кто-то понимает, как это работает и говорит мне. (Если решил я отправлю решение здесь, конечно)

Ссылки:

ответ

2

Общее точное решение не существует.

Как указано в ответе вы связаны с

C = X * a + Y * (a-1) 

формула для расчета цветового канала C из цветов X и Y, в то время как a это значение альфа X.

Итак, когда вы пытаетесь выяснить цвет + альфа-канал, вам нужно решить это уравнение 3 раза (один раз для каждого цвета). Каждое из этих уравнений имеет 2 неизвестных.

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

При определении один точное решение невозможно, вы можете, конечно, определить один или несколько возможных решений, со следующим образом:

X = C/a - Y + Y/a // Formula from above solved for X 

Таким образом, возможные решения

r3 = r2/a - r1 + r1/a  
g3 = g2/a - g1 + g1/a 
b3 = b2/a - b1 + b1/a 

с

  • rgb(r1, g1, b1) - цвет фона,
  • rgb(r2, g2, b2) - смешанный цвет
  • и rgba(r3, g3, b3, a) - цвет, который был нарисован на заднем плане.

Если теперь выбрать a так, что ни один из r3, g3 и b3 не ниже 0 или выше 255, вы получите верное решение.