RGB颜色的常见混合与绘画的混合颜色非常不同,它是混合光而不是混合颜料.
例如:
Blue (0,0,255) + Yellow (255,255,0) = Grey (128,128,128)
Run Code Online (Sandbox Code Playgroud)
(它应该是蓝色+黄色=绿色)
是否有任何已知的混色算法,就像混合真实颜色一样?
我已经尝试过以下内容:
将两种颜色转换为HSV并混合色调(乘以从饱和度计算的系数),以及饱和度和值通道的简单平均值.然后我从两种颜色计算平均亮度,并调整结果颜色以匹配此亮度.这很有效,但色调混合有时是错误的,例如:
Red (Hue 0°) + Blue (Hue 240°) = Green (Hue 120°)
Run Code Online (Sandbox Code Playgroud)
我发现有时我需要将色调值移动360°(当色调之间的差异大于180°时).
Red (Hue 360°) + Blue (Hue 240°) = Magenta/fuchsia (Hue 300°)
Run Code Online (Sandbox Code Playgroud)
但这种转变也不是很好,例如:
Cyan (Hue 179°) + Red (Hue 0°) = Hue 89.5°
Cyan (Hue 181°) + Red (Hue 0°) --> shifting is performed (the difference is greater than 180°)
Cyan (Hue 181°) + Red (Hue 360°) = Hue 270.5°
Run Code Online (Sandbox Code Playgroud)
(色调179 +红色)和(色调181 +红色)产生两种完全不同的颜色. …
我必须以自然的方式混合一些颜色.这意味着
blue + yellow = green
blue + red = purple
Run Code Online (Sandbox Code Playgroud)
等等.我得到了RGB-Values的颜色.当我尝试混合它们时,我得到了正确的"RGB"结果
green + red = yellow
yellow + blue = white
Run Code Online (Sandbox Code Playgroud)
但不是正确的"天然湿涂料" - 结果.如何以自然的方式混合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));
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我在这个帖子中读到的内容非常有前途 - 我将C1和C2转换为L a b*,混合它们 - 将其转换回RGB并返回该颜色.