Змішування кольорів - це просто лінійна інтерполяція на канал, так? Отже, математика досить проста. Якщо у вас 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)
Якщо вони дають різні значення, то ви не можете змусити це точно відповідати, але ви можете усереднити альфи, щоб наблизитися якомога ближче. Наприклад, у світі немає прозорості, яка дозволила б вам поставити зелений колір над червоним, щоб отримати синій.