给定RGB值,如何创build色调(或阴影)?
给定一个RGB值,如168, 0, 255
如何创build色调(使其更浅)和色调(使其更深)?
在几个阴影和着色选项中:
-
对于阴影,将每个分量乘以其先前值的1/4,1/2,3/4等等。 因子越小,阴影越深。
-
对于色彩,计算(255 – 之前的值),乘以1/4,1/2,3/4等(因子越大,色调越浅),并将其添加到之前的值。
随着基于物理的渲染的出现,实践已经出现在线性RGB中进行颜色处理(例如色调和其他阴影)。 正如Violet Giraffe在伽马校正的评论中暗示的那样,有多种RGB色彩空间,其中很多是通过伽玛校正转换成线性RGB和从线性RGB转换而来的。 然而,大多数计算机显示器显示的颜色不可能是线性RGB。 一个这样的非线性色彩空间是sRGB; 转换为线性RGB 大致相当于将每个sRGB颜色分量(范围从0到1)提高到2.2的幂。
一些定义
- 阴影是通过“变暗”色调或“join黑色”
- 色调是通过“调色”或“加白”来产生的,
创build色调或阴影
根据您的颜色模型,可以使用不同的方法创build较暗(阴影)或较亮(有色)的颜色:
-
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
-
更一般地,导致用颜色
RGBA(aR,aG,aB,alpha)
分层颜色RGB(currentR,currentG,currentB)
的颜色是: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
。 转换公式不是微不足道的,但可以在互联网上find。 根据你的语言,它也可能作为一个核心function:
- 在JavaScript的RGB到HSV颜色?
- 将RGB值转换为HSV
比较模型
-
RGB
具有实现简单的优点,但是:- 你只能相对地遮蔽或调色
- 你不知道你的颜色是否已经着色或着色
-
HSV
或HSB
有点复杂,因为你需要玩两个参数来获得你想要的(Saturation
和Value
/Brightness
) - 从我的观点来看,
HSL
是最好的:- 由CSS3支持(用于webapp)
- 简单而准确:
-
50%
意味着不变的色调 -
>50%
表示色相较淡(色调) -
<50%
表示色调较暗(阴影)
-
- 给定一种颜色,你可以确定它是否已经着色或着色
- 您可以相对或绝对地对色彩进行着色或淡化(只需更换“
Lightness
部分)
- 如果你想了解更多关于这个主题: Wiki:Colors Model
- 有关这些模型的更多信息: 维基百科:HSL和HSV
这是一个PHP解决scheme: http : //www.charles-reace.com/test/colors.php?color=123456
我目前正在试验canvas和像素…我发现这个逻辑对我更好。
- 用这个来计算灰度(luma?)
- 但同时具有现有价值和新的“色彩”价值
- 计算差异(我发现我不需要乘)
-
添加以抵消“色调”值
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;
或类似的东西…