如何使用C#“自然”混合颜色?

48

我需要用一种自然的方式混合一些颜色。这意味着

blue + yellow = green 
blue + red = purple

等等,我得到的颜色是以RGB值表示的。当我尝试混合它们时,我得到了正确的“RGB”结果,例如:

green + red = yellow
yellow + blue = white

但没有得到正确的“自然湿润油漆”效果。有什么好的方法可以以自然的方式混合RGB颜色吗?

如果有人知道在Microsoft.Xna.Framework.Graphics命名空间中的解决方案,那就太好了,但通用的解决方案也会有所帮助 :)


@Jay Bazuzi:

  

请发布一个代码示例,显示您要做什么。

当然 - 这是我混合两种RGB颜色的函数。

public Color colorMixer(Color c1, Color c2)
{

    int _r = Math.Min((c1.R + c2.R),255);
    int _g = Math.Min((c1.G + c2.G),255);
    int _b = Math.Min((c1.B + c2.B),255);

    return new Color(Convert.ToByte(_r),
                     Convert.ToByte(_g),
                     Convert.ToByte(_b));
}

我在这个讨论串中所了解到的,非常有前途 - 我将把 C1 和 C2 转换为 Lab*,混合它们 - 再将其转换回 RGB 并返回该颜色。


请发布一个代码示例,展示您想要实现的内容。 - Jay Bazuzi
请参阅stackoverflow.com/questions/10254022/,该问题在此处有更详细的讨论。 - Scott Burns
太棒了!你的colorMixer方法也对我帮助很大! - K-Dawg
2个回答

47

“自然湿涂料”有点含糊不清;按建议混合CMYK颜色无法奏效,因为仍在添加颜色。

如果您想获得类似于Photoshop的结果(如Jon B所检查的),您需要使用L*a*b*空间。转换RGB到/从Lab的公式和描述在此处

Lab空间是专门设计的,使得线性变化对应于人眼感知的一定量的颜色变化。这很重要,因为例如我们对绿色比其他颜色更敏感,因为我们感知不同的变化取决于色调和亮度等因素。

尝试使用当前正在建议的任何其他方法,不仅会产生您不想要的颜色,而且还不能代表颜色的“恒定”的变化,特别是如果您将其用于像渐变这样的变化需要保持恒定的情况下。


这是一个有前途的想法,但是在将它们转换为LAB之后,我如何混合这两种颜色呢?请看我的问题:https://dev59.com/_mUq5IYBdhLWcg3wEcRZ - Tamás Pap
以同样的方式混合任何其他量。例如,将它们的组成部分平均在一起。 - Quuxplusone

3
你可以通过 WIC 免费获得 cmyk<->rgb 转换。 但它只适用于 .NET 3.0。

它并不是,WIC在任何.NET版本中都有可用的COM接口。 - Marek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接