如果您使用 HSV 而不是 RGB,您会发现颜色更易于处理这类问题。
“等间距的颜色”几乎总是意味着“等间距的色调”。因此,对于色调中的 [0,360),您只需通过均分该范围来平均空间。
现在你有了一个色调,你只需要找到那个色调的“柔和”版本。对我来说,这意味着稍微降低颜色的饱和度。对于初学者来说,我会说 80% 饱和。
在我的测试中,我使用了 100% 的价值。然后只需转换为RGB。这是我一直在玩的:
<body>
<script>
// taken from http://ariya.blogspot.com/2008/07/converting-between-hsl-and-hsv.html
function hsv_to_hsl(s, v)
{
var ss, ll;
ll = (2. - s) * v;
ss = 1. * s * v;
ss /= (ll <= 1.) ? (ll) : 2. - ll;
ll /= 2.;
return [ss, ll];
}
function do_colors(sat, light)
{
n = 15;
document.write(n + " colors at " + sat + "% sat, " + light + "% lightness<br />");
for(var x = 0; x < n; ++x)
{
hue = 360.0 / n * x;
html_chunk = "<div style='width: 50px; height: 50px; display: inline-block; background: hsl(" + hue + ", " + sat + "%, " + light + "%);'> </div>";
document.write(html_chunk);
}
document.write("<br />");
}
do_colors(100, 50);
do_colors(95, 75);
do_colors(75, 50);
do_colors(100, 35);
// rudimentary averages from your colors
sl = hsv_to_hsl(.7, .9);
s = sl[0] * 100;
l = sl[1] * 100;
do_colors(s, l);
do_colors(75, 60);
</script>
</body>
不是 C#,我知道,但只是想抓住亮点并坐下来。
否则,您可以查看样本颜色,看看 HSV/HSL 值是否存在相关性,并尝试从中推导出算法。如果您绘制 S/H 和 V/H,您会在图表中看到灰色的大幅下降 --- 这似乎是一个异常值。 (底行左起第三个。)忽略该值,S 约为 75%,而值略低于 90%。使用这些值可能会得到最好的结果。
链接:http://jsfiddle.net/ZHyAQ/