Учитывая значение RGB, например 168, 0, 255
, как создать оттенки (сделать его легче) и оттенки (сделать его темнее) цвета?
Учитывая значение RGB, как мне создать оттенок (или оттенок)?
Ответ 1
Среди нескольких вариантов затенения и тонирования:
-
Для оттенков умножьте каждый компонент на 1/4, 1/2, 3/4 и т.д. Его предыдущего значения. Чем меньше фактор, тем темнее оттенок.
-
Для оттенков рассчитайте (255 - предыдущее значение), умножьте его на 1/4, 1/2, 3/4 и т.д. (Чем больше коэффициент, тем светлее оттенок) и добавьте это к предыдущему значению (при условии, что каждое.component - это 8-битное целое число).
Обратите внимание, что цветовые манипуляции (такие как оттенки и другие оттенки) должны выполняться в линейном RGB. Однако цвета RGB, указанные в документах или закодированные в изображениях и видео, вряд ли будут иметь линейный RGB, и в этом случае так называемая обратная функция передачи должна применяться к каждому из компонентов цвета RGB. Эта функция зависит от цветового пространства RGB. Например, в цветовом пространстве sRGB (которое можно предположить, если цветовое пространство RGB неизвестно), эта функция примерно эквивалентна повышению каждого компонента цвета sRGB (в диапазоне от 0 до 1) до степени 2,2. (Обратите внимание, что "линейный RGB" не является цветовым пространством RGB.)
См. Также комментарий Фиолетового жирафа о "гамма-коррекции".
Ответ 2
Некоторые определения
- оттенок создается путем "затемнения" оттенка или "добавления черного".
- A оттенок создается путем "выравнивания" оттенка или "добавления белого"
Создание оттенка или тени
В зависимости от вашей цветовой модели существуют различные способы создания более темного (затененного) или более светлого (тонированного) цвета:
-
RGB
:-
В оттенок:
newR = currentR * (1 - shade_factor) newG = currentG * (1 - shade_factor) newB = currentB * (1 - shade_factor)
-
Чтобы подчеркнуть:
newR = currentR + (255 - currentR) * tint_factor newG = currentG + (255 - currentG) * tint_factor newB = currentB + (255 - currentB) * tint_factor
-
В общем случае цвет, который приводит к цвету
RGB(currentR,currentG,currentB)
с цветомRGBA(aR,aG,aB,alpha)
:newR = currentR + (aR - currentR) * alpha newG = currentG + (aG - currentG) * alpha newB = currentB + (aB - currentB) * alpha
где
(aR,aG,aB) = black = (0,0,0)
для затенения, и(aR,aG,aB) = white = (255,255,255)
для тонирования -
-
HSV
илиHSB
:- Чтобы затенять: опустите
Value
/Brightness
или увеличьтеSaturation
- Чтобы отменить: опустите
Saturation
или увеличьтеValue
/Brightness
- Чтобы затенять: опустите
-
HSL
:- Чтобы затенять: опустите
Lightness
- Чтобы изменить оттенок: увеличьте
Lightness
- Чтобы затенять: опустите
Существуют формулы для преобразования из одной цветовой модели в другую. Согласно вашему первоначальному вопросу, если вы находитесь в RGB
и хотите использовать модель HSV
для тени, например, вы можете просто преобразовать в HSV
, сделать затенение и преобразовать обратно в RGB
. Формула для конвертации не является тривиальной, но может быть найдена в Интернете. В зависимости от вашего языка он также может быть доступен как основная функция:
Сравнение моделей
-
RGB
имеет то преимущество, что его очень просто реализовать, но:- вы можете только оттенять или оттенять свой цвет относительно
- Вы понятия не имеете, если ваш цвет уже тонирован или затенен.
-
HSV
илиHSB
является сложным, потому что вам нужно играть с двумя параметрами, чтобы получить то, что вы хотите (Saturation
иValue
/Brightness
) -
HSL
является лучшим с моей точки зрения:- поддерживается CSS3 (для webapp)
- простой и точный:
-
50%
означает неизмененный Hue -
>50%
означает, что оттенок светлее (оттенок) -
<50%
означает, что оттенок темнее (оттенок)
-
- с учетом цвета, который вы можете определить, если он уже тонирован или затенен.
- вы можете оттенять или оттенять цвет относительно или абсолютно (просто заменив часть
Lightness
)
- Если вы хотите узнать больше об этой теме: Wiki: Модель цветов
- Для получения дополнительной информации о том, что эти модели: Википедия: HSL и HSV
Ответ 3
В настоящее время я экспериментирую с холстом и пикселями... Я нахожу, что эта логика работает для меня лучше.
- Используйте это, чтобы рассчитать серость (яркость?)
- но как с существующим значением, так и с новым значением tint
- вычислить разницу (я нашел, что мне не нужно было умножать)
-
добавить для смещения значения оттенка
var grey = (r + g + b) / 3; var grey2 = (new_r + new_g + new_b) / 3; var dr = grey - grey2 * 1; var dg = grey - grey2 * 1 var db = grey - grey2 * 1; tint_r = new_r + dr; tint_g = new_g + dg; tint_b = new_b _ db;
или что-то в этом роде...
Ответ 4
Вот PHP-решение: http://www.charles-reace.com/test/colors.php?color=123456