Biorąc pod uwagę wartość RGB, na przykład 168, 0, 255
, w jaki sposób mogę utworzyć odcienie (rozjaśnić) i odcienie (przyciemnić) koloru?
Biorąc pod uwagę wartość RGB, na przykład 168, 0, 255
, w jaki sposób mogę utworzyć odcienie (rozjaśnić) i odcienie (przyciemnić) koloru?
Odpowiedzi:
Wśród kilku opcji cieniowania i barwienia:
W przypadku odcieni pomnóż każdy składnik przez 1/4, 1/2, 3/4 itd. Poprzedniej wartości. Im mniejszy współczynnik, tym ciemniejszy odcień.
W przypadku odcieni oblicz (255 - poprzednia wartość), pomnóż to przez 1/4, 1/2, 3/4 itd. (Im większy współczynnik, tym jaśniejszy odcień) i dodaj to do poprzedniej wartości (zakładając, że każda .component to 8-bitowa liczba całkowita).
Zwróć uwagę, że manipulacje kolorami (takie jak odcienie i inne cieniowanie) powinny być wykonywane w liniowym RGB . Jednak kolory RGB określone w dokumentach lub zakodowane w obrazach i wideo prawdopodobnie nie będą w liniowym RGB, w takim przypadku tak zwana funkcja odwrotnego transferu musi zostać zastosowana do każdego ze składników koloru RGB. Ta funkcja różni się w zależności od przestrzeni kolorów RGB. Na przykład w przestrzeni kolorów sRGB (co można założyć, jeśli przestrzeń kolorów RGB jest nieznana), ta funkcja jest z grubsza równoważna podniesieniu każdego składnika koloru sRGB (w zakresie od 0 do 1) do potęgi 2,2. (Zwróć uwagę, że „liniowy RGB” nie jest przestrzenią kolorów RGB).
Zobacz także komentarz Violet Giraffe na temat „korekcji gamma”.
W zależności od modelu kolorów istnieją różne metody tworzenia ciemniejszego (cieniowanego) lub jaśniejszego (podbarwionego) koloru:
RGB
:
Zacienić:
newR = currentR * (1 - shade_factor)
newG = currentG * (1 - shade_factor)
newB = currentB * (1 - shade_factor)
Aby zabarwić:
newR = currentR + (255 - currentR) * tint_factor
newG = currentG + (255 - currentG) * tint_factor
newB = currentB + (255 - currentB) * tint_factor
Bardziej ogólnie, kolor powodujący nałożenie koloru RGB(currentR,currentG,currentB)
na kolor RGBA(aR,aG,aB,alpha)
to:
newR = currentR + (aR - currentR) * alpha
newG = currentG + (aG - currentG) * alpha
newB = currentB + (aB - currentB) * alpha
gdzie (aR,aG,aB) = black = (0,0,0)
do cieniowania i (aR,aG,aB) = white = (255,255,255)
do barwienia
HSV
lub HSB
:
Value
/ Brightness
lub zwiększSaturation
Saturation
lub zwiększ Value
/Brightness
HSL
:
Lightness
Lightness
Istnieją formuły do konwersji z jednego modelu kolorów na inny. Zgodnie z początkowym pytaniem, jeśli jesteś w RGB
grze i chcesz na przykład użyć HSV
modelu do cieniowania, możesz po prostu przekonwertować na HSV
, wykonać cieniowanie i przekonwertować z powrotem na RGB
. Formuły do konwersji nie są trywialne, ale można je znaleźć w Internecie. W zależności od języka może być również dostępna jako funkcja podstawowa:
RGB
ma tę zaletę, że jest naprawdę łatwy do wdrożenia, ale:
HSV
lub HSB
jest trochę skomplikowane, ponieważ musisz grać z dwoma parametrami, aby uzyskać to, czego chcesz ( Saturation
& Value
/ Brightness
)HSL
jest najlepszy z mojego punktu widzenia:
50%
oznacza niezmieniony odcień>50%
oznacza, że odcień jest jaśniejszy (odcień)<50%
oznacza, że odcień jest ciemniejszy (odcień)Lightness
część)Obecnie eksperymentuję z płótnem i pikselami ... Uważam, że ta logika działa lepiej.
dodaj, aby zrównoważyć wartość „tinty”
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;
czy jakoś tak...
rs = r * 0.25
,gs = g * 0.25
,bs = b * 0.25
(który jest bardzo ciemny odcień); Tint (RT GT, bt)rt = r + (0.25 * (255 - r))
,gt = g + (0.25 * (255 - g))
,bt = b + (0.25 * (255 - b))
(który jest bardzo lekki odcień). Zrobiłem to jako część fajnej tablicy, która stworzyła wiele odcieni i działała świetnie. Mam nadzieję, że to pomoże. Dzięki Peter.