【问题标题】:Given an RGB value, how do I create a tint (or shade)?给定一个 RGB 值,如何创建色调(或阴影)?
【发布时间】:2011-09-30 16:41:58
【问题描述】:

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

【问题讨论】:

    标签: colors rgb


    【解决方案1】:

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

    【讨论】:

    • 我试过了,效果很好。我认为编写公式的示例会很有帮助。原始(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 小时前删除的评论。)
    【解决方案2】:

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

    1. 使用它来计算灰度(亮度?)
    2. 但同时具有现有值和新的“色调”值
    3. 计算差(我发现我不需要乘)
    4. 添加以抵消“色调”值

      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;
      

    或类似的东西......

    【讨论】:

      【解决方案3】:

      一些定义

      • 阴影是通过“加深”色调或“添加黑色”产生的
      • 色调是通过“淡化”色调或“添加白色”产生的

      创建色调或阴影

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

      • 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) 用于着色

      • HSVHSB:

        • 要遮蔽:降低Value / Brightness 或增加Saturation
        • 要着色:降低Saturation 或增加Value / Brightness
      • HSL:
        • 要遮蔽:降低Lightness
        • 要着色:增加Lightness

      存在从一种颜色模型转换为另一种颜色模型的公式。根据您最初的问题,如果您在RGB 中并想使用HSV 模型进行着色,例如,您可以转换为HSV,进行着色并转换回RGB。转换公式并非易事,但可以在互联网上找到。根据您的语言,它也可能作为核心功能提供:

      比较模型

      • RGB 的优点是实现起来非常简单,但是:
        • 您只能相对地着色或着色您的颜色
        • 您不知道您的颜色是否已经着色或着色
      • HSVHSB 有点复杂,因为你需要使用两个参数来获得你想要的(Saturation & Value / Brightness
      • HSL 在我看来是最好的:
        • 受 CSS3 支持(适用于 webapp)
        • 简单准确:
          • 50% 表示未改变的色调
          • >50% 表示色相较浅(色调)
          • <50% 表示色调更暗(阴影)
        • 给定一种颜色,您可以确定它是否已经着色或着色
        • 您可以相对或绝对地对颜色进行着色或着色(只需替换 Lightness 部分)

      【讨论】:

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