【发布时间】:2011-09-30 16:41:58
【问题描述】:
给定一个 RGB 值,例如 168, 0, 255,我如何创建颜色的色调(使其更亮)和阴影(使其更暗)?
【问题讨论】:
给定一个 RGB 值,例如 168, 0, 255,我如何创建颜色的色调(使其更亮)和阴影(使其更暗)?
【问题讨论】:
在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 关于“伽马校正”的评论。
【讨论】:
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))(这是一种非常浅的色调)。我把它作为一个很酷的阵列的一部分,创造了很多色调,效果很好。希望有帮助。谢谢彼得。
我目前正在试验画布和像素...我发现这种逻辑更适合我。
添加以抵消“色调”值
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;
或类似的东西......
【讨论】:
根据您的颜色模型,有不同的方法可以创建更暗(阴影)或更亮(着色)的颜色:
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 部分)【讨论】: