Когда-то писал наложение одного цвета на другой с помощью этого:
var result = [],
alpha = this.getAlpha(),
otherAlpha = 0.5,
source = this.getSource(),
otherSource = otherColor.getSource();
for (var i = 0; i < 3; i++) {
result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha)));
}
result[3] = alpha;
this.setSource(result);
return this;
Полный код -
здесь. Это библиотека Fabric.js.
Вам нужна эта формула - Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha)), которая выполняет наложение одного на другой цвет. Где source - исходный цвет (массив с R, G, B, A), otherSource (массив с R, G, B, A), otherAlpha - результирующая прозрачность.