Я пытаюсь оценить темноту цвета, выбранного палитрой цветов, чтобы увидеть, "слишком ли он черный", и если да, установите его на белый. Я подумал, что могу использовать первые символы шестнадцатеричного значения, чтобы осуществить это. Он работает, но меняет и некоторые вполне законные «светлые» цвета.
У меня есть код для этого:
if (lightcolor.substring(0,3) == "#00"|| lightcolor.substring(0,3) == "#010"){
lightcolor="#FFFFFF";
color=lightcolor;
}
Должен быть более эффективный способ с помощью шестнадцатеричной математики узнать, что цвет вышел за пределы определенного уровня темноты? Например, если lightcolor + "какое-то шестнадцатеричное значение" <= "какое-то шестнадцатеричное значение", тогда установите его на белый.
Я добавил tinyColor, который может пригодиться для этого, но я точно не знаю.
javascript
colors
Дшиз
источник
источник
Ответы:
Вы должны извлечь три компонента RGB по отдельности, а затем использовать стандартную формулу для преобразования полученных значений RGB в их воспринимаемую яркость.
Предполагая шестизначный цвет:
РЕДАКТИРОВАТЬ
С мая 2014 года
tinycolor
теперь естьgetBrightness()
функция, хотя и с использованием весовых коэффициентов CCIR601 вместо вышеупомянутых ITU-R.РЕДАКТИРОВАТЬ
Результирующий диапазон значений яркости составляет 0..255, где 0 - самый темный, а 255 - самый светлый. Значения больше 128 считаются незначительными
tinycolor
. (бессовестно скопировано из комментариев @ pau.moreno и @Alnitak)источник
luma
диапазон значений:0..255
где0
самый темный и255
самый светлый (сумма трех коэффициентов равна одному).isDark()
порог жестко запрограммирован на 128Библиотека TinyColor (вы уже упомянули о ней) предоставляет несколько функций для проверки и управления цветами, среди них:
getBrightness
isLight
isDark
getLuminance
источник
Я нашел эту PHP-функцию WooCommerce Wordpress ( wc_hex_is_light ) и преобразовал ее в JavaScript. Работает отлично!
источник
Вы можете вычислить яркость :
Так что здорово выбрать, будет ли текст белым или черным.
Приведенный выше метод позволяет передавать цвет в разных форматах, но алгоритм в основном только в
luminance_get
.Когда я его использовал, я устанавливал черный цвет, если яркость была больше
180
, в противном случае - белый.источник
Здесь есть важное различие между яркостью и яркостью. Яркость, в конце концов, является мерой того, сколько энергии проходит через определенную область, и полностью игнорирует то, как наши системы восприятия воспринимают эту энергию. Яркость, с другой стороны, является мерой того, как мы воспринимаем эту энергию, и учитывает взаимосвязь между яркостью и нашей системой восприятия. (В качестве источника путаницы есть термин, называемый относительной яркостью, который, кажется, используется как синоним терминов яркости. Это меня здорово сбило с толку).
Чтобы быть точным, вы ищете «яркость», «значение» или «относительную яркость», как предлагали другие. Вы можете рассчитать это по-разному (например, быть человеком!) Http://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
источник
Это работает с шестнадцатеричным кодом, например #fefefe
Вы можете изменить его на возврат
true
илиfalse
на изменениек
источник
Возможное решение - преобразовать цвет из RGB в HSB . HSB обозначает оттенок, насыщенность и яркость (также известный как HSV, где V означает значение). Тогда вам нужно проверить только один параметр: яркость.
источник
Я понимаю, что этому разговору несколько лет, но он все еще актуален. Я хотел добавить, что у моей команды была такая же проблема в Java (SWT), и я обнаружил, что это немного точнее:
источник