给定一个RGB 值,比如 168, 0, 255
,我该如何创建颜色的色调(使其变浅)和阴影(使其变暗)?
在涂色和着色的几种选项中:
对于阴影,将每个组件乘以其上一个值的1/4、1/2、3/4等系数。系数越小,阴影越暗。
对于着色,计算(255-上一个值),将其乘以1/4、1/2、3/4等系数(系数越大,着色越浅),然后加到上一个值上(假设每个组件都是8位整数)。
请注意,颜色操作(如着色和其他阴影)应在线性RGB中完成。但是,在文档中指定或编码为图像和视频的RGB颜色不太可能处于线性RGB中,在这种情况下,需要对RGB颜色的每个组件应用所谓的逆转换函数。此函数因RGB颜色空间而异。例如,在sRGB颜色空间中(如果未知RGB颜色空间,则可以假定为该颜色空间),此函数“大致”相当于将每个sRGB颜色组件(从0到1)提高到2.2的幂。(请注意,“线性RGB”不是RGB颜色空间。)
另请参见Violet Giraffe关于“伽玛校正”的评论。
根据您的颜色模型,有不同的方法可以创建较暗(阴影)或较亮(色调)的颜色:
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%
表示未经修改的Hue> 50%
表示Hue较浅(色调)< 50%
表示Hue较暗(阴影)Lightness
部分即可)我目前正在尝试使用画布和像素... 我发现这种逻辑对我更好。
add to offset the 'tint' value
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,gt,bt):rt = r + (0.25 * (255 - r))
,gt = g + (0.25 * (255 - g))
,bt = b + (0.25 * (255 - b))
(这是一个相当浅的色调)。我将其作为一个酷炫的数组的一部分来创建许多色调,效果很好。希望这有所帮助。谢谢Peter。 - Thomas