Враховуючи значення RGB, як, наприклад 168, 0, 255
, як я можу створювати відтінки (зробити світлішими) та відтінки (зробити темнішими) колір?
Враховуючи значення RGB, як, наприклад 168, 0, 255
, як я можу створювати відтінки (зробити світлішими) та відтінки (зробити темнішими) колір?
Відповіді:
Серед декількох варіантів затінення та тонування:
Для відтінків помножте кожен компонент на 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.)
Дивіться також коментар Віолет Жирафа про "корекцію гамми".
Залежно від вашої кольорової моделі існують різні методи створення темнішого (затіненого) або світлішого (тонованого) кольору:
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
з моєї точки зору найкраще:
50%
означає незмінний відтінок>50%
означає, що відтінок світліший (відтінок)<50%
означає, що відтінок темніший (відтінок)Lightness
деталь)Я зараз експериментую з полотном і пікселями ... Я вважаю, що ця логіка для мене працює краще.
додати для компенсації значення 'відтінок'
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;
чи щось подібне ...
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))
(тобто досить ясно - відтінок). Я зробив це як частина крутого масиву, який створив безліч відтінків, і він чудово працював. Сподіваюся, що це допомагає. Дякую Петру.