Учитывая значение RGB, как мне создать оттенок (или оттенок)?

124

Например 168, 0, 255, учитывая значение RGB, как мне создать оттенки (сделать его светлее) и оттенки (сделать его темнее) цвета?

DenaliHardtail
источник

Ответы:

153

Среди нескольких вариантов растушевки и тонировки:

  • Для оттенков умножьте каждый компонент на 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.)

См. Также комментарий Violet Giraffe о «гамма-коррекции».

Питер О.
источник
20
Я попробовал это, и это отлично сработало. Я подумал, что будет полезно написать примеры формул. Оригинал (r, g, b); Тень (RS, GS, шс): rs = r * 0.25, gs = g * 0.25, bs = b * 0.25(то есть довольно темный оттенок); Оттенок (к.т., г.т., Ь): rt = r + (0.25 * (255 - r)), gt = g + (0.25 * (255 - g)), bt = b + (0.25 * (255 - b))(то есть довольно светло - оттенок). Я сделал это как часть классного массива, который создавал множество оттенков, и он отлично работал. Надеюсь, это поможет. Спасибо, Питер.
Thomas
1
Вы сделали ошибку. Это наоборот.
Francesco Menzani
Вы уверены, что эти манипуляции не должны учитывать гамма-коррекцию?
Violet Giraffe
1
@VioletGiraffe: Вы хорошо заметили гамма-коррекцию. Смотрите мою правку. (Это заменяет мой удаленный комментарий,
Питер О.
97

Некоторые определения

  • Оттенок получают путем «потемнение» оттенок или «добавление черного»
  • Оттенок получают путем «ligthening» оттенок или «добавление белого»

Создание оттенка или тени

В зависимости от вашей цветовой модели существуют разные методы создания более темного (затемненного) или более светлого (тонированного) цвета:

  • 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 (для веб-приложений)
    • просто и точно:
      • 50% означает неизменный оттенок
      • >50% означает, что оттенок светлее (оттенок)
      • <50% означает, что оттенок темнее (оттенок)
    • по цвету вы можете определить, уже ли он окрашен или растушеван
    • вы можете подкрасить или оттенить цвет относительно или полностью (просто заменив Lightnessдеталь)

JBE
источник
1
Я считаю, что здесь «оттенок получается путем« затемнения »оттенка» , под оттенком вы имеете в виду цвет. Потому что, если вы говорите об оттенке, как в HSL / HSV, изменение его приведет к другому цвету, а не оттенку / оттенку. Оттенок (0-360 °) сам по себе не может стать темнее / светлее. Чтобы придать оттенок / оттенок цвета, необходимо изменить значения SL / SV. Это определение может ввести кого-то в заблуждение, полагая, что изменение оттенка приведет к получению более темного / светлого цвета.
akinuri
Вариант оттенка работает только для диапазона цветов, начинающегося с 0. Добавьте половину вашего цветового диапазона к значению цветового канала, затем выполните математические вычисления и снова вычтите этот диапазон. Если ваш цвет подписан, и вы можете выполнить расчет, не повредив что-либо из-за переполнения, это работает как задумано.
t0b4cc0 01
3

В настоящее время я экспериментирую с холстом и пикселями ... Я считаю, что эта логика работает для меня лучше.

  1. Используйте это, чтобы рассчитать оттенок серого (яркость?)
  2. но с существующим значением и новым значением оттенка
  3. посчитайте разницу (я обнаружил, что мне не нужно умножать)
  4. добавить, чтобы компенсировать значение оттенка

    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;
    

или что-то вроде того...

блэр
источник