Сдвиг цвета, чтобы получить определенный коэффициент контрастности
Есть ли способ, учитывая два цвета (назовем их первым цветом и вторым цветом), чтобы выяснить, на какой цвет должен быть изменен второй цвет, чтобы получить контрастность 4,5? Другими словами, на какую величину нам нужно сдвинуть второй цвет, чтобы получить коэффициент контрастности 4,5? Код яркости и соотношения:
Код яркости:
function getLuminance (rgb){
for (var i =0; i<rgb.length; i++) {
if (rgb[i] <= 0.03928) {
rgb[i] = rgb[i] / 12.92;
} else {
rgb[i] = Math.pow( ((rgb[i]+0.055)/1.055), 2.4 );
}
}
var l = (0.2126 * rgb[0]) + (0.7152 * rgb[1]) + (0.0722 * rgb[2]);
return l;
};
Код коэффициента:
var ratio = 1;
var l1 = getLuminance([first_color_red.value/255, first_color_green.value/255, first_color_blue.value/255]);
var l2 = getLuminance([second_color_red.value/255, second_color_green.value/255, second_color_blue.value/255]);
if (l1 >= l2) {
ratio = (l1 + .05) / (l2 + .05);
} else {
ratio = (l2 + .05) / (l1 + .05);
}
Проблема, с которой я сталкиваюсь, связана с вычислением яркости - просто исходя из соотношения, кажется, что невозможно вычислить значения R, G и B, поскольку они будут тремя неизвестными (зависит от того, какой путь каждого из цветов берет - больше 0,03928 или нет...).
Мы можем добавить больше ограничений, рассмотрев расчеты яркости цвета и разницы цветов, как показано ниже:
Код яркости цвета: порог яркости-разницы - это то, что он больше или равен 125.
fY=((first_color_r.value * 299) + (first_color_g.value * 587) + (first_color_b.value * 114)) / 1000;
sY=((second_color_r.value * 299) + (second_color_g.value * 587) + (second_color_b.value * 114)) / 1000;
brightnessDifference = Math.abs(fY-sY);
Код Различия Цвета: порог для colorDifference - то, что это больше или равно 500.
colorDifference = (Math.max (second_color_r.value, first_color_r.value) - Math.min (second_color_r.value, first_color_r.value)) +
(Math.max (second_color_g.value, first_color_g.value) - Math.min (second_color_g.value, first_color_g.value)) +
(Math.max (second_color_b.value, first_color_b.value) - Math.min (second_color_b.value, first_color_b.value));
Я прочитал следующий пост: Как программно выбрать хорошие контрастные цвета RGB?
Однако расчет дополнительных цветов не всегда решает проблему! Это может даже не привести к контрасту 4,5 ... Есть идеи, как этого добиться?