给定RGB值,如168, 0, 255
,如何创建颜色(使其更亮)和阴影(使其更暗)?
答案 0 :(得分:129)
用于着色和着色的several options:
对于阴影,将每个分量乘以其的1/4,1 / 2,3 / 4等 以前的价值。因子越小,阴影越暗。
对于色调,计算(255 - 前一个值),乘以1/4, 1 / 2,3 / 4等(因子越大,色调越浅),并将其添加到前一个值(假设each.component是一个8位整数)。
请注意,颜色处理(如色调和其他阴影)应在线性RGB 中完成。但是,在文档中指定或在图像和视频中编码的RGB颜色不可能是线性RGB,在这种情况下,需要将所谓的反向传递函数应用于每种RGB颜色的组件。此功能随RGB色彩空间而变化。例如,在sRGB颜色空间中(如果RGB颜色空间未知,可以假设),此函数大致等效于将每个sRGB颜色分量(范围从0到1)提高到功率2.2。 (请注意,“线性RGB”不是RGB色彩空间。)
另见Violet Giraffe关于“伽马校正”的评论。
答案 1 :(得分:78)
根据您的颜色模型,有不同的方法可以创建更深(阴影)或更浅(浅色)的颜色:
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
,进行着色并转换回{ {1}}。转换公式并非微不足道,但可以在互联网上找到。根据您的语言,它也可能作为核心功能提供:
RGB
的优点是实现起来非常简单,但是:
RGB
或HSV
有点复杂,因为您需要使用两个参数来获得所需内容(HSB
& Saturation
/ Value
)Brightness
是最好的:
HSL
表示未经改动的Hue 50%
表示Hue更轻(色调)>50%
表示Hue更暗(阴影)<50%
部分)答案 2 :(得分:3)
我目前正在尝试使用画布和像素...我发现这种逻辑对我来说更有效。
添加以抵消'tint'值
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;
或类似的......