Вот функция, над которой я работал, чтобы программно осветлить или затемнить гексаговый цвет на определенную сумму. Просто передайте строку типа "3F6D2A"
для цвета (col
) и base10 integer (amt
) для уменьшения или затемнения. Чтобы затемнить, проведите отрицательное число (т.е. -20).
Причина, по которой я это сделала, была из-за всех решений, которые я нашел, до сих пор они, казалось, слишком усложняли проблему. И у меня было ощущение, что это можно сделать только с помощью пары строк кода. Пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы или какие-либо корректировки, чтобы ускорить его.
function LightenDarkenColor(col,amt) {
col = parseInt(col,16);
return (((col & 0x0000FF) + amt) | ((((col>> 8) & 0x00FF) + amt) << 8) | (((col >> 16) + amt) << 16)).toString(16);
}
Для разработки используйте здесь более читаемую версию:
function LightenDarkenColor(col,amt) {
var num = parseInt(col,16);
var r = (num >> 16) + amt;
var b = ((num >> 8) & 0x00FF) + amt;
var g = (num & 0x0000FF) + amt;
var newColor = g | (b << 8) | (r << 16);
return newColor.toString(16);
}
И, наконец, версия для обработки цветов, которые могут (или не могут) иметь "#" в начале. Плюс регулировка для неправильных значений цвета:
function LightenDarkenColor(col,amt) {
var usePound = false;
if ( col[0] == "#" ) {
col = col.slice(1);
usePound = true;
}
var num = parseInt(col,16);
var r = (num >> 16) + amt;
if ( r > 255 ) r = 255;
else if (r < 0) r = 0;
var b = ((num >> 8) & 0x00FF) + amt;
if ( b > 255 ) b = 255;
else if (b < 0) b = 0;
var g = (num & 0x0000FF) + amt;
if ( g > 255 ) g = 255;
else if ( g < 0 ) g = 0;
return (usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16);
}
ОК, так что теперь это не просто пара строк, но это кажется намного проще, и если вы не используете "#" и не нуждаетесь в проверке цветов вне диапазона, это всего лишь пара строк.
Если вы не используете "#", вы можете просто добавить его в код, например:
var myColor = "3F6D2A";
myColor = LightenDarkenColor(myColor,10);
thePlaceTheColorIsUsed = ("#" + myColor);
Думаю, мой главный вопрос: я исправлю здесь? Разве это не охватывает некоторые (обычные) ситуации?