Смешивание цветов - это просто линейная интерполяция на канал, верно? Итак, математика довольно проста. Если у вас RGBA1 вместо RGB2, эффективный визуальный результат RGB3 будет:
r3 = r2 + (r1-r2)*a1
g3 = g2 + (g1-g2)*a1
b3 = b2 + (b1-b2)*a1
… Где альфа-канал находится в диапазоне от 0,0 до 1,0.
Проверка работоспособности: если альфа равна 0, является ли RGB3 таким же, как RGB2? Да. Если альфа равна 1, является ли RGB3 таким же, как RGB1? Да.
Если вы заблокировали только цвет фона и конечный цвет, существует большое количество цветов RGBA (бесконечное, в пространстве с плавающей запятой), которые могут удовлетворить требования. Таким образом, вам нужно выбрать либо цвет полосы, либо желаемый уровень непрозрачности и узнать значение другого.
Выбор цвета на основе альфа
Если вы знаете RGB3 (окончательный желаемый цвет), RGB2 (цвет фона) и A1 (желаемую степень непрозрачности), и вы просто ищете RGB1, то мы можем переупорядочить уравнения следующим образом:
r1 = (r3 - r2 + r2*a1)/a1
g1 = (g3 - g2 + g2*a1)/a1
b1 = (b3 - b2 + b2*a1)/a1
Есть некоторые цветовые комбинации, которые теоретически возможны, но невозможны в стандартном диапазоне RGBA. Например, если фон чистый черный, желаемый воспринимаемый цвет - чистый белый, а желаемая альфа составляет 1%, тогда вам потребуются:
r1 = g1 = b1 = 255/0.01 = 25500
… Сверхяркий белый цвет в 100 раз ярче, чем любой другой.
Выбор альфы на основе цветов
Если вы знаете RGB3 (окончательный желаемый цвет), RGB2 (цвет фона) и RGB1 (цвет, который у вас есть, непрозрачность которого вы хотите изменить), и вы просто ищете A1, то мы можем изменить расположение уравнения таким образом:
a1 = (r3-r2) / (r1-r2)
a1 = (g3-g2) / (g1-g2)
a1 = (b3-b2) / (b1-b2)
Если они дают разные значения, вы не можете добиться точного совпадения, но вы можете усреднить альфы, чтобы получить как можно более близкие значения. Например, в мире нет прозрачности, которая позволила бы вам поставить зеленый поверх красного, чтобы получить синий.