在 several options 中用于着色和着色:
对于阴影,将每个分量乘以其先前值的 1/4、1/2、3/4 等。系数越小,阴影越深。
对于色调,计算 (255 - 前一个值),将其乘以 1/4、1/2、3/4 等(系数越大,色调越浅),然后将其添加到前一个值(假设每个.component 是一个 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) 用于着色
着色: 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
HSV 或 HSB: 着色:降低值/亮度或增加饱和度 着色:降低饱和度或增加值/亮度
阴影:降低值/亮度或增加饱和度
着色:降低饱和度或增加值/亮度
HSL:着色:降低亮度 着色:增加亮度
阴影:降低亮度
着色:增加亮度
存在从一种颜色模型转换为另一种颜色模型的公式。根据您最初的问题,例如,如果您在 RGB
并想使用 HSV
模型进行着色,您可以转换为 HSV
,进行着色并转换回 RGB
。转换公式并非易事,但可以在互联网上找到。根据您的语言,它也可能作为核心功能提供:
javascript中的RGB到HSV颜色?
将 RGB 值转换为 HSV
比较模型
RGB 的优点是实现起来非常简单,但是:您只能对颜色进行着色或着色,相对您不知道您的颜色是否已经着色或着色
你只能相对地着色或着色你的颜色
你不知道你的颜色是否已经着色或着色
HSV 或 HSB 有点复杂,因为您需要使用两个参数来获得您想要的(饱和度和值/亮度)
从我的角度来看,HSL 是最好的:由 CSS3 支持(用于 webapp)简单而准确:50% 表示未改变的色调 >50% 表示色调更亮(色调)<50% 表示色调更暗(阴影)给定一种颜色,您可以确定它是否已经着色或着色,您可以相对或绝对着色或着色颜色(只需更换 Lightness 部分)
受 CSS3 支持(适用于 webapp)
简单而准确:50% 表示未改变的色调 >50% 表示色调较浅(色调) <50% 表示色调较深(阴影)
50% 表示未改变的色调
>50% 表示色相较浅(色调)
<50% 表示色调更暗(阴影)
给定一种颜色,您可以确定它是否已经着色或着色
您可以相对或绝对地对颜色进行着色或着色(只需更换 Lightness 部分)
如果您想了解有关此主题的更多信息:Wiki:颜色模型
有关这些模型是什么的更多信息:维基百科:HSL 和 HSV
我目前正在试验画布和像素......我发现这个逻辑更适合我。
使用它来计算灰度(亮度?),但使用现有值和新的“色调”值计算差异(我发现我不需要相乘)添加以抵消“色调”值 var gray = ( r + g + b) / 3; var gray2 = (new_r + new_g + new_b) / 3; var dr = 灰色 - gray2 * 1; var dg = 灰色 - gray2 * 1 var db = 灰色 - gray2 * 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))
(这是一种非常浅的色调)。我把它作为一个很酷的阵列的一部分,创造了很多色调,效果很好。希望有帮助。谢谢彼得。