Сдвиг цвета для получения определенного коэффициента контрастности

Есть ли способ, учитывая два цвета (назовем их первым цветом и вторым цветом), выяснить, на какой цвет нужно изменить второй цвет, чтобы получить коэффициент контрастности 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 или нет...).

Мы можем добавить дополнительные ограничения, рассмотрев расчеты цветовой яркости и цветового различия, как показано ниже:

Код яркости цвета. Пороговое значение для параметра яркостиDifference должно быть больше или равно 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);

Код цветового различия. Пороговое значение для цветового различия — это значение, превышающее или равное 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 ... Есть идеи, как этого можно добиться?


person BigBug    schedule 23.03.2015    source источник
comment
Это не моя область знаний, но тот факт, что есть три неизвестных, по-видимому, подразумевает, что существует несколько степеней свободы при получении ответа, т. е. вы можете сдвигать второй цвет многими различными способами, чтобы получить цвет, удовлетворяющий вашим требованиям. ограничения. Следовательно, вам может понадобиться больше ограничений, чтобы получить один ответ.   -  person radiaph    schedule 23.03.2015
comment
Мы можем добавить больше ограничений, добавив вычисление цветовой яркости и цветовой разницы. Я обновлю вопрос, чтобы добавить их в   -  person BigBug    schedule 23.03.2015