ChatGPT解决这个技术问题 Extra ChatGPT

给定一个 RGB 值,如何创建色调(或阴影)?

给定一个 RGB 值,如 168, 0, 255,我如何创建颜色的色调(使其更亮)和阴影(使其更暗)?


P
Peter O.

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 关于“伽马校正”的评论。


我试过了,效果很好。我认为编写公式的示例会很有帮助。原始(r,g,b);阴影(rs,gs,bs):rs = r * 0.25gs = g * 0.25bs = b * 0.25(这是一个非常暗的阴影);色调 (rt,gt,bt):rt = r + (0.25 * (255 - r))gt = g + (0.25 * (255 - g))bt = b + (0.25 * (255 - b))(这是一种非常浅的色调)。我把它作为一个很酷的阵列的一部分,创造了很多色调,效果很好。希望有帮助。谢谢彼得。
你犯了一个错误。反之亦然。
你确定这些操作不能解释伽马校正吗?
@VioletGiraffe:您对伽马校正提出了一个很好的观点。请参阅我的编辑。 (这取代了我 22 小时前已删除的评论。)
C
Community

一些定义

阴影是通过“加深”色调或“添加黑色”来产生的

色调是通过“点亮”色调或“添加白色”来产生的

创建色调或阴影

根据您的颜色模型,有不同的方法可以创建较深(阴影)或较浅(着色)的颜色:

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


我在这里相信“阴影是通过“变暗”色调产生的”,色调是指颜色。因为如果您在 HSL/HSV 中谈论色调,则更改它会产生不同的颜色,而不是阴影/色调。色相 (0-360°) 本身不能变暗/变亮。要给出颜色阴影/色调,必须修改 SL/SV 值。这个定义可能会误导人们认为改变色调会产生更深/更浅的颜色。
阴影版本仅适用于从 0 开始的颜色范围。将颜色范围的一半添加到颜色通道值,然后进行数学运算,然后再次减去该范围。如果您的颜色已签名,并且您可以进行计算而不会因为溢出而破坏某些东西,这将按预期工作。
H
Himanshu

我目前正在试验画布和像素......我发现这个逻辑更适合我。

使用它来计算灰度(亮度?),但使用现有值和新的“色调”值计算差异(我发现我不需要相乘)添加以抵消“色调”值 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;

或类似的东西...