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?
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”.
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.Kilka definicji
Tworzenie odcienia lub cienia
W zależności od modelu kolorów istnieją różne metody tworzenia ciemniejszego (cieniowanego) lub jaśniejszego (podbarwionego) koloru:
RGB
:Zacienić:
Aby zabarwić:
Bardziej ogólnie, kolor powodujący nałożenie koloru
RGB(currentR,currentG,currentB)
na kolorRGBA(aR,aG,aB,alpha)
to:gdzie
(aR,aG,aB) = black = (0,0,0)
do cieniowania i(aR,aG,aB) = white = (255,255,255)
do barwieniaHSV
lubHSB
:Value
/Brightness
lub zwiększSaturation
Saturation
lub zwiększValue
/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ć naHSV
, wykonać cieniowanie i przekonwertować z powrotem naRGB
. 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:Porównanie modeli
RGB
ma tę zaletę, że jest naprawdę łatwy do wdrożenia, ale:HSV
lubHSB
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ęść)źródło
Obecnie eksperymentuję z płótnem i pikselami ... Uważam, że ta logika działa lepiej.
dodaj, aby zrównoważyć wartość „tinty”
czy jakoś tak...
źródło