Я много читал в очень полном посте: Формула для определения яркости цвета RGB
Меня беспокоит то, что даже со всеми этими формулами я не могу получить прекрасный результат ... И это довольно неприятно, так как я хочу сортировать цвета в палитре, от самых темных до самых светлых. Если сортировка неверна, это очень тяжело смотреть.
Быстрый пример с формулой: (0,2126 * R + 0,7152 * G + 0,0722 * B), который кажется наиболее распространенным ответом Интернет.
Отредактировано после ответа Петра
function colorCodeToRGB(colorCode) {
colorCode = colorCode.substr(1);
return [
colorCode.substr(0, 2),
colorCode.substr(2, 2),
colorCode.substr(4, 2)
].map(it => parseInt(it, 16));
}
const luminanceCoefficients = [.2126, .7152, .0722];
function getLuminance(color) {
const [r, g, b] = colorCodeToRGB(color);
return r * luminanceCoefficients[0] + g * luminanceCoefficients[1] + b * luminanceCoefficients[2];
}
function linearizeSRGB(colorChannel) {
colorChannel /= 255;
if (colorChannel <= .04045 ) {
return colorChannel / 12.92;
} else {
return Math.pow((colorChannel + .055)/1.055, 2.4);
}
}
console.log('First set of colors');
console.log('#1883b1', getLuminance('#1883b1'));
console.log('#2c3b4c', getLuminance('#2c3b4c'));
console.log('Second set of colors');
console.log('#920f1e', getLuminance('#920f1e'));
console.log('#c3313d', getLuminance('#c3313d'));
.c {
height: 2rem;
width: 2rem;
}
Sample of colors
<span class="c" style="background-color: #1883b1"> </span>
<span class="c" style="background-color: #2c3b4c"> </span>
<span class="c" style="background-color: #920f1e"> </span>
<span class="c" style="background-color: #c3313d"> </span>
Каждый может видеть, что первый синий цвет светлее второго, и его значение меньше, хотя во втором наборе первый красный цвет кажется темнее второго, хотя и имеет меньшее значение ...
Я не понимаю, есть ли способ на самом деле определить воспринимаемую яркость?
Я протестировал все формул в посте, упомянутых в начале этого вопроса, и, сдвигая палитру цветов, я всегда нахожу забавные случаи, иллюстрирующие проблему. У меня нет ограничений, я могу работать с HSL, RGB, CIELAB, с чем угодно!
Спасибо, ребята, заранее!