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

时间:2011-07-07 17:57:17

标签: colors rgb

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

3 个答案:

答案 0 :(得分:129)

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

答案 1 :(得分:78)

一些定义

  • 通过“变暗”色调或“添加黑色”来产生阴影
  • 通过“加亮”色调或“添加白色”产生色调

创建色调或阴影

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

  • 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,进行着色并转换回{ {1}}。转换公式并非微不足道,但可以在互联网上找到。根据您的语言,它也可能作为核心功能提供:

比较模型

  • RGB的优点是实现起来非常简单,但是:
    • 你只能相对遮蔽或着色你的颜色
    • 您不知道您的颜色是否已经着色或着色
  • RGBHSV有点复杂,因为您需要使用两个参数来获得所需内容(HSB& Saturation / Value
  • 从我的观点来看,
  • Brightness是最好的:
    • 受CSS3支持(适用于webapp)
    • 简单准确:
      • HSL表示未经改动的Hue
      • 50%表示Hue更轻(色调)
      • >50%表示Hue更暗(阴影)
    • 给定颜色,您可以确定它是否已经着色或着色
    • 您可以相对或绝对地着色或着色(仅通过替换<50%部分)

答案 2 :(得分:3)

我目前正在尝试使用画布和像素...我发现这种逻辑对我来说更有效。

  1. 用它来计算灰度(亮度?)
  2. 但同时包含现有值和新的“tint”值
  3. 计算差异(我发现我不需要乘法)
  4. 添加以抵消'tint'值

    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;
    
  5. 或类似的......