Вот функция, над которой я работал, чтобы программно осветлить или затемнить шестнадцатеричный цвет на определенную величину. Просто передайте строку, например, "3F6D2A"
для color ( 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);
}
// TEST
console.log( LightenDarkenColor("3F6D2A",40) );
Для разработки используйте здесь более удобную для чтения версию:
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);
}
// TEST
console.log(LightenDarkenColor("3F6D2A", -40));
И, наконец, версия для обработки цветов, которые могут (или не могут) иметь «#» в начале. Плюс настройка для неправильных значений цвета:
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);
Я предполагаю, что мой главный вопрос, я прав здесь? Разве это не охватывает некоторые (нормальные) ситуации?
источник
Ответы:
Ну, этот ответ стал своим собственным зверем. Много новых версий, это было глупо долго. Большое спасибо всем великим авторам этого ответа. Но, чтобы все было просто для масс. Я заархивировал все версии / историю развития этого ответа на свой github . И началось все заново с StackOverflow с самой новой версией. Особая благодарность Майку 'Pomax' Kamermans за эту версию. Он дал мне новую математику.
Эта функция (
pSBC
) принимает цвет HEX или RGB.pSBC
может затенить его темнее или светлее или смешать со вторым цветом, а также может передать его прямо через него, но конвертировать из шестнадцатеричного в RGB (Hex2RGB) или из шестнадцатеричного RGB в шестнадцатеричный (RGB2Hex). Все без вас, даже не зная, какой цветовой формат вы используете.Это работает очень быстро, вероятно, самый быстрый, особенно учитывая его многочисленные функции. Это было долгое время в процессе создания. Смотрите всю историю на моем github . Если вы хотите абсолютно наименьший и самый быстрый способ затенения или смешивания, см. Микро-функции ниже и используйте один из демонов скорости с 2 вкладышами. Они отлично подходят для интенсивной анимации, но эта версия достаточно быстра для большинства анимаций.
Эта функция использует Log Blending или Linear Blending. Тем не менее, он НЕ конвертируется в HSL, чтобы правильно осветлить или затемнить цвет. Следовательно, результаты этой функции будут отличаться от тех функций, которые намного больше и медленнее, которые используют HSL.
Особенности:
"#AA6622"
или"#bb551144"
."rgb(123,45,76)"
или"rgba(45,15,74,0.45)"
."#C41"
становится"#CC4411"
.c0
цвет (от), либо цветc1
(до) имеет альфа-канал, то возвращаемый цвет будет иметь альфа-канал. Если оба цвета имеют альфа-канал, то возвращаемый цвет будет представлять собой линейную смесь двух альфа-каналов с использованием заданного процента (как если бы это был обычный цветовой канал). Если только один из двух цветов имеет альфа-канал, эта альфа будет просто передана возвращаемому цвету. Это позволяет смешивать / затенять прозрачный цвет, сохраняя уровень прозрачности. Или, если уровни прозрачности также должны смешиваться, убедитесь, что оба цвета имеют альфа. Когда затенение, это пройдет альфа-канал прямо через. Если вам нужна базовая заливка, которая также затеняет альфа-канал, используйтеrgb(0,0,0,1)
илиrgb(255,255,255,1)
какc1
(до) цвет (или их шестнадцатеричные эквиваленты). Для цветов RGB альфа-канал возвращаемого цвета будет округлен до 3 десятичных знаков.c0
(от) цвета; возвращаемый цвет всегда будет в цветовом форматеc1
(до) цвета, если таковой существует. Еслиc1
цвета нет, передайте его'c'
какc1
цвет, и он закрасит и преобразуетc0
цвет. Если требуется только преобразование, укажите0
также и процент (p
). Еслиc1
цвет пропущен или неstring
передан, он не будет преобразован.pSBCr
может быть передан Hex или RGB цвет, и он возвращает объект, содержащий эту информацию о цвете. Это в форме: {r: XXX, g: XXX, b: XXX, a: X.XXX}. Где.r
,.g
и.b
имеют диапазон от 0 до 255. А когда нет альфа - :.a
-1. В противном случае:.a
имеет диапазон от 0,000 до 1000.rgba()
больше,rgb()
когда цвет с альфа-каналом был передан вc0
(из) и / илиc1
(в).null
. Пример:pSBC(0.5,"salt") == null
где, как он считает,#salt
является допустимым цветом. Удалите четыре строки, которые заканчиваются,return null;
чтобы удалить эту функцию и сделать ее быстрее и меньше.true
forl
(4-й параметр), чтобы использовать Linear Blending.Код:
Применение:
Картинка ниже поможет показать разницу в двух методах наложения:
Микро Функции
Если вы действительно хотите скорость и размер, вам придется использовать RGB, а не HEX. RGB более прост и прост, HEX пишет слишком медленно и имеет слишком много разновидностей для простого двухстрочного (т. Е. Это может быть 3, 4, 6 или 8-значный код HEX). Вам также придется пожертвовать некоторыми функциями, без проверки ошибок, без HEX2RGB и RGB2HEX. Кроме того, вам нужно будет выбрать конкретную функцию (на основе ее имени ниже) для математики смешивания цветов, а также, если вы хотите, чтобы затемнение или смешивание. Эти функции поддерживают альфа-каналы. И когда оба входных цвета имеют альфы, они будут линейно смешаны. Если только у одного из двух цветов есть альфа, он передаст его прямо к полученному цвету. Ниже приведены две невероятно быстрые и небольшие функции лайнера:
Хотите узнать больше? Прочитайте полную рецензию на github .
PT
(Ps. Если у кого-то есть математика для другого метода смешивания, пожалуйста, поделитесь.)
источник
tinycolor.darken(color,amount);
function shadeColor2($color, $percent) { $color = str_replace("#", "", $color); $t=$percent<0?0:255; $p=$percent<0?$percent*-1:$percent; $RGB = str_split($color, 2); $R=hexdec($RGB[0]); $G=hexdec($RGB[1]); $B=hexdec($RGB[2]); return '#'.substr(dechex(0x1000000+(round(($t-$R)*$p)+$R)*0x10000+(round(($t-$G)*$p)+$G)*0x100+(round(($t-$B)*$p)+$B)),1); }
8
, добавьте10%
,8.8
какие раунды вы получите9
. Тогда9.09%
забирай9
и получаешь8.1819
. Который округляет,8
так что это плохой пример. Но она по- прежнему показывает , что вы принимаете9.09%
в9
и8.8
. Так что там могут быть некоторые числа, которые не округляются так же, как мой пример здесь.Я сделал решение, которое работает очень хорошо для меня:
Пример облегчения:
Пример Darken:
источник
R = ((R<255)?R:255).toString(16);
тогда сделатьR = R.length==1 ? "0"+R : R
для скорости. И я не уверен, что смысл toUpperCase?var R = parseInt(color.substring(1, 3), 16) var G = parseInt(color.substring(3, 5), 16) var B = parseInt(color.substring(5, 7), 16) if (R == 0) R = 32; if (G == 0) G = 32; if (B == 0) B = 32;
Вот супер простой вкладыш, основанный на ответе Эрика
Примеры:
источник
Это то, что я использовал, основываясь на вашей функции. Я предпочитаю использовать шаги за процент, потому что это более интуитивно для меня.
Например, 20% от значения 200 синего цвета сильно отличается от 20% от значения 40 синего цвета.
В любом случае, вот моя модификация, спасибо за вашу оригинальную функцию.
источник
Я попробовал вашу функцию, и возникла небольшая ошибка: если какое-то окончательное значение 'r' составляет только 1 цифру, результат выглядит как: 'a0a0a', когда правильное значение, например, '0a0a0a'. Я просто быстро исправил это, добавив это вместо вашего возврата:
Может быть, это не так хорошо, но это делает работу. Отличная функция, кстати. Как раз то, что мне было нужно. :)
источник
ты думал о преобразовании rgb> hsl? тогда просто двигайте Светимость вверх и вниз? это путь, которым я бы пошел.
Беглый взгляд на некоторые алгоритмы достал мне следующие сайты.
PHP: http://serennu.com/colour/rgbtohsl.php
Javascript: http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascriptРЕДАКТИРОВАТЬ вышеуказанная ссылка больше не действительна. Вы можете просмотреть git hub для источника страницы или суть
Альтернативно, другой вопрос StackOverflow может быть хорошим местом для поиска.
Несмотря на то, что это неправильный выбор для OP, ниже приводится пример кода, который я изначально предлагал. (Предполагая, что у вас есть функции преобразования rgb / hsl)
Это предполагает:
hslToRgb
иrgbToHsl
.colorValue
представляет собой строку в форме #RRGGBBХотя, если мы обсуждаем css, существует синтаксис для указания hsl / hsla для IE9 / Chrome / Firefox.
источник
Версия C # ... обратите внимание, что я получаю цветные строки в этом формате # FF12AE34, и мне нужно вырезать #FF.
источник
int
и дваvars
для одного и того же типа данных.Я хотел изменить цвет на определенный уровень яркости - независимо от того, какой яркостью был цвет раньше - вот простая функция JS, которая, кажется, работает хорошо, хотя я уверен, что она может быть короче
источник
p
есть диапазон0-100
? Я даже не знаю, как правильно определить яркость в RGB, это вещь HSL. Например,#FF00FF
ярче, чем#FF0000
? Если это так, это будет означать, что пурпурный цвет в два раза ярче красного. Поэтому используется чистый красный тест. Перейдите в чистый красный#FF0000
, установите яркость 50%, и вот мы получаем#FF4040
, верно? Я бы предположил сделать 50% яркости красного цвета, мы бы стали темнее, увидев, что он уже полностью яркий, как при#800000
яркости 150%#FF8080
. Розовый более яркий красный? или красный уже полностью яркий?L
канал буквально яркость. Моя [личная ментальная] проблема здесь в том, что для меня#FF0000
это совершенно ясно. И#FF4040
светлее, но не ярче .... для меня свет означает ближе к белому, как розовый. И насколько яркость у него есть, и у него полный красный, такой красный, полный яркий. Следовательно,#FF0000
не может быть сделана ярче ... но скорее .. легче ... может быть, я просто урод, лол !! Я действительно не знаю теорию цвета, ооочень, я просто говорю о своем ...Следующий метод позволит вам осветлить или затемнить значение экспозиции шестнадцатеричной (шестнадцатеричной) цветовой цепочки:
Для последнего значения параметра в GetHexFromRGB () передайте двойное значение где-то между -1 и 1 (-1 - черный, 0 - без изменений, 1 - белый):
источник
Как просто оттенить цвет в PHP?
источник
Я сделал порт превосходной библиотеки xcolor, чтобы удалить ее зависимость от jQuery. Там есть множество функций, включая светлые и темные цвета.
Действительно, преобразование гекса в RGB - это совершенно отдельная функция от осветления или затемнения цветов. Держите вещи сухими, пожалуйста. В любом случае, если у вас есть цвет RGB, вы можете просто добавить разницу между желаемым уровнем освещения и уровнем освещения для каждого из значений RGB:
См. Https://github.com/fresheneesz/xolor для получения дополнительной информации.
источник
Я давно хотел иметь возможность создавать оттенки / оттенки цветов, вот мое решение JavaScript:
источник
#
цвета шестиугольника. Извините, если это показалось как "одобрение" ... Я видел это как рецензирование. Если вы не хотите, чтобы кто-то анализировал ваш код или оставил отзыв, прошу прощения.Ваш подход в порядке :) Я немного упрощаю вашу самую короткую версию (для контроля насыщенности смотрите здесь )
Показать фрагмент кода
И версия с проверкой # и цветовых диапазонов
Показать фрагмент кода
источник
Я тоже сделал простую упаковку. Я использовал выпуклость IR ^ 3, конечно, значения RGB находятся в IN ^ 3, что не является выпуклым, так что это не совсем идеально
Чтобы затемнить я использовал следующее
И осветлить
Вот пакет https://github.com/MarchWorks/colortone
Демо https://colortone.now.sh/
с тем, как я делаю вещи, если вы передадите соотношение -1, вы получите черный, белый, если отношение равно 1. Передача 0, поскольку отношение не изменит цвет
источник
Мне нужно было это в C #, это может помочь разработчикам .net
источник