Как проверить, если шестнадцатеричный цвет "слишком черный"?
Я пытаюсь оценить темноту цвета, выбранного палитрой цветов, чтобы увидеть, является ли он" слишком черным", и если да, установите его на белый. Я думал, что могу использовать первые символы шестнадцатеричного значения, чтобы снять это. Он работает, но он также переключает некоторые законно "светлые" цвета.
У меня есть код, который делает это:
if (lightcolor.substring(0,3) == "#00"|| lightcolor.substring(0,3) == "#010"){
lightcolor="#FFFFFF";
color=lightcolor;
}
должен быть более эффективный способ с помощью hex math узнать, что цвет вышел за пределы определенного уровня темноты? Например, если lightcolor + " некоторые шестнадцатеричное значение "
Я добавил tinyColor, который может быть полезен для этого, но я не знаю наверняка.
куча!
8 ответов:
вы должны извлечь три компонента RGB по отдельности, а затем использовать стандартную формулу для преобразования полученных значений RGB в их воспринимаемую яркость.
предполагая, что шесть символов цвет:
var c = c.substring(1); // strip # var rgb = parseInt(c, 16); // convert rrggbb to decimal var r = (rgb >> 16) & 0xff; // extract red var g = (rgb >> 8) & 0xff; // extract green var b = (rgb >> 0) & 0xff; // extract blue var luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per ITU-R BT.709 if (luma < 40) { // pick a different colour }EDIT
С Мая 2014 Года
tinycolorтеперьgetBrightness()функция, хотя и с использованием весовых коэффициентов CCIR601 вместо приведенных выше коэффициентов ITU-R.
The TinyColor библиотека (вы уже упоминали об этом) предоставляет несколько функций для проверки и управления цветами, среди них:
возвращает воспринимаемую яркость цвета, от 0-255, как определено Рекомендации По Доступности Веб-Контента (Версия 1.0).
tinycolor("#fff").getBrightness(); // 255возвращает логическое значение, указывающее, является ли воспринимаемая яркость цвета светом.
tinycolor("#fff").isLight(); // true tinycolor("#000").isLight(); // falseвозвращает логическое значение, указывающее, является ли воспринимаемая яркость цвета темной.
tinycolor("#fff").isDark(); // false tinycolor("#000").isDark(); // trueвозвращает воспринимаемую яркость цвета, от 0-1, как определено Доступность Веб-Контента Руководство (Версия 2.0).
tinycolor("#fff").getLuminance(); // 1
вы можете вычислить яркость:
яркость, таким образом, является показателем того, насколько яркой будет поверхность.
Так это здорово, чтобы выбрать, если текст должен быть белым или черным.
var getRGB = function(b){ var a; if(b&&b.constructor==Array&&b.length==3)return b; if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))return[parseInt(a[1]),parseInt(a[2]),parseInt(a[3])]; if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55]; if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3], 16)]; if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)]; return (typeof (colors) != "undefined")?colors[jQuery.trim(b).toLowerCase()]:null }; var luminance_get = function(color) { var rgb = getRGB(color); if (!rgb) return null; return 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]; }метод выше позволяет передавать цвет в разных форматах, но алгоритм в основном только в
luminance_get.когда я использовал его, я устанавливал цвет на черный, если яркость была больше, чем
180, белый в противном случае.
здесь есть важное различие между яркостью и яркостью. Яркость, в конце дня, является мерой того, сколько энергии проходит через определенную область и полностью игнорирует то, как наши перцептивные системы воспринимают эту энергию. Яркость, с другой стороны, является мерой того, как мы воспринимаем эту энергию и учитывает взаимосвязь между яркостью и нашей системой восприятия. (В качестве точки путаницы существует термин, называемый относительной яркостью, который, по-видимому, используйте синонимично с терминами яркости. Это меня здорово споткнуло).
чтобы быть точным, вы ищете "яркость" или "значение" или "относительно яркости", как предложили другие. Вы можете рассчитать это по-разному (таково быть человеком!) http://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
- возьмите максимум R, G и B.
- возьмите среднее значение max и min от R, G и B.
- возьмите среднее значение все трое.
- используйте некоторые средневзвешенные, как другие предложили здесь.
эта работа с hex e. g #fefefe
function isTooDark(hexcolor){ var r = parseInt(hexcolor.substr(1,2),16); var g = parseInt(hexcolor.substr(3,2),16); var b = parseInt(hexcolor.substr(4,2),16); var yiq = ((r*299)+(g*587)+(b*114))/1000; // Return new color if to dark, else return the original return (yiq < 40) ? '#2980b9' : hexcolor; }
вы можете изменить его, чтобы вернуть
trueилиfalseизменениеreturn (yiq < 40) ? '#2980b9' : hexcolor;до
return (yiq < 40);
возможным решением было бы преобразовать ваш цвет от RGB до HSB. HSB означает оттенок, насыщенность и яркость (также известный как HSV, где V-значение). Тогда у вас есть только один параметр для проверки: яркость.
Я нашел эту функцию WooCommerce Wordpress PHP (wc_hex_is_light) и я преобразован в JavaScript. Отлично работает!
function wc_hex_is_light(color) { const hex = color.replace('#', ''); const c_r = parseInt(hex.substr(0, 2), 16); const c_g = parseInt(hex.substr(2, 2), 16); const c_b = parseInt(hex.substr(4, 2), 16); const brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000; return brightness > 155; }
private Color getFontColor(RGB bgColor) { Color COLOR_BLACK = new Color(Display.getDefault(), 0, 0, 0); Color COLOR_WHITE = new Color(Display.getDefault(), 255, 255, 255); double luminance = Math.sqrt(0.241 * Math.pow(bgColor.red, 2) + 0.691 * Math.pow(bgColor.green, 2) + 0.068 * Math.pow(bgColor.blue, 2)); if (luminance >= 130) { return COLOR_BLACK; } else { return COLOR_WHITE; } }
Comments