Если я вас правильно понял -
Вам нужно нормализовать значение красного канала, а затем использовать его как значение микширования:
mix = R / 255
Затем смешайте белый с обычным цветом за вычетом красного канала, используя коэффициент смешивания:
Original-red White
R' = 0 + 255 * mix
G' = G * (1 - mix) + 255 * mix
B' = B * (1 - mix) + 255 * mix
Просто обратите внимание, что он убьет желтый и пурпурный цвета, так как они, конечно, используют красный канал, и чем больше красного, тем больше смешивается белого.
Вы должны уметь обойти это, используя цветовую модель CMYK или их комбинацию, чтобы можно было разделить все основные компоненты. Затем отмените микс с помощью f.ex. компоненты желтого / пурпурного цвета из CMYK.
Однако процесс смешивания должен быть таким же, как описано.
Концептуальная демонстрация
var ctx = c.getContext("2d");
var img = new Image;
img.onload = function() {
c.width = img.width;
c.height = img.height;
ctx.drawImage(this, 0, 0);
var idata = ctx.getImageData(0,0,c.width,c.height),
data = idata.data, len = data.length, i, mix;
/* mix = R / 255
R = 0 + 255 * mix
G = G * (1 - mix) + 255 * mix
B = B * (1 - mix) + 255 * mix
*/
for(i = 0; i < len; i+= 4) {
mix = data[i] / 255; // mix using red
data[i ] = 255 * mix; // red channel
data[i+1] = data[i+1] * (1 - mix) + 255 * mix; // green channel
data[i+2] = data[i+2] * (1 - mix) + 255 * mix; // blue channel
}
ctx.putImageData(idata,0,0);
};
img.crossOrigin = "";
img.src = "//i.imgur.com/ptOPQZx.png";
document.body.appendChild(img)
<h4>Red removed + to white</h4><canvas id=c></canvas><h4>Original:</h4>
person
Community
schedule
27.06.2016