【问题标题】:Additive blending of RGB colors representing light代表光的 RGB 颜色的加法混合
【发布时间】:2016-03-01 18:06:23
【问题描述】:

我有一个代表光的 RGB 颜色。我正在寻找一种算法,以模拟(或类似)照明的方式在任意背景(例如,可能是图像)上绘制它。

一些例子:

  • RGB=#888888 表示强度为 50% 的白光

    • 在白色 (#ffffff) 背景像素上绘制此图将无济于事
    • 在黑色 (#000000) 背景像素上绘制此图将绘制为 #888888
    • 将其绘制在红色 (#ff0000) 背景像素上会导致“较浅的红色”
  • RGB=#ff0000 表示 100% 强度的红光

    • 在白色 (#ffffff) 背景像素上绘制应该会产生“浅红色”(红色和白色的混合)
    • 在黑色 (#000000) 背景像素上绘制此图将绘制为 #880000
  • RGB=#000000 表示没有光。在任何背景上绘画都应该没有效果。

我希望能够将原始 RGB 颜色转换为(一组)RGBA 颜色,以便在背景上绘制。我一直在为此寻找一种算法并使用 HSL、HSB、alpha 等,但找不到实现此目的的通用方法。

是否有通用算法来实现我想要的?

更新:我知道this question,但我不认为这是重复的(尽管名称相似)。该问题的公认答案描述了与此场景(照明)不匹配的行为(红色 + 黑色 = 深红色)。我正在专门寻找一种算法来模拟(彩色)照明。

【问题讨论】:

  • 您是否尝试将每种颜色相加并除以二?除了#888888 超过#ffffff 之外,它将满足所有这些示例,但我认为正确的行为(基于其他示例)应该是#c3c3c3,这也是和除法。
  • @Panda 我不认为这是重复的。我已编辑问题以解释原因。
  • 如果是用光绘画,那么在白色背景上绘画红色应该会产生白色——除非你减去光。如果这是正确的,并且您永远不想减去光,那么您所需要的只是加法混合:总结颜色并限制在有效范围内。
  • @Ike 如果我在环境光下有一堵白墙并在上面放红灯,我会认为它是“红色的”。

标签: algorithm image-processing graphics colors rgb


【解决方案1】:

如果您将这些值视为十进制值,则您的值范围为 0-255。您可以将这两种颜色相加,然后将它们重新缩放回范围。

FF0000 + FFFFFF 
= 255,0,0 + 255,255,255 
= 510,255,255

然后将其按255/510 缩放到

510 * 255/510, 255 * 255/510, 255 * 255/510
= 255, 127, 127

根据需要为浅红色。

【讨论】:

  • 是的,这是正确的,但我正在寻找一种“在任意背景上”(例如图像)绘制颜色的方法,而不是逐个像素地迭代。我会澄清这一点。我希望有办法实现这一点,也许是在玩 alpha。
猜你喜欢
  • 2012-09-29
  • 1970-01-01
  • 2014-12-28
  • 2012-05-10
  • 2012-09-22
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多