如何从KnownColor中选择“漂亮”的颜色?

时间:2016-06-16 11:43:49

标签: c# charts

我想将X系列线条绘制成不同但“漂亮”的颜色。 “好”,我的意思是光明和不同。

这就是我现在正在做的事情:

var colors = Enum.GetValues(typeof(KnownColor));

int c = -1;
foreach (var ser in AllSeries)
{
    c++;
    chart.PlotDataSeries( Color.FromKnownColor((KnownColor)colors.GetValue(c % 100 + 1)), );
}

但这给了我很多类似的单调颜色,主要是黑色和灰色,因为KnownColor包含了很多重复的“系统菜单”类型颜色。

4 个答案:

答案 0 :(得分:1)

一种方法是“导航色彩空间”。我不是C#程序员,但我在图表中使用的方法虽然是手动的,但是使用Hue-Saturation-Value颜色空间而不是Red-Green-Blue。我手动选择我想要开始的“漂亮”颜色。然后将色调的值空间除以您需要的颜色数,并将此值用作色调值的增量。这应该为您提供均匀分布的颜色,这些颜色看起来很好,因为它们实际上具有相同的饱和度和亮度。

更多细节

我看了一下当前的.NET / C#API,看起来没有一种简单的方法可以从RGB值以外的任何颜色创建随机颜色。这是我在Javascript + HTML中描述的渐变的示例。从HSV或HSL空间到RGB的转换是特定于语言的,但Creating a C# Color from HSL values的答案应该有所帮助。

function setColor(id, hue) {
  var elm = document.getElementById(id);
  var saturation = document.getElementById("saturation").value;
  var lightness = document.getElementById("lightness").value;
  elm.style.color = "hsl(" + hue + ", " + saturation + "%, " +
                         lightness + "%)";
}

function setColors() {
    setColor("first", 0 * (360 / 5));
    setColor("second", 1 * (360 / 5));
    setColor("third", 2 * (360 / 5));
    setColor("fourth", 4 * (360 / 5));
}
<p id="first">First Color<p>
<p id="second">Second Color</p>
<p id="third">Third Color</p>
<p id="fourth">Fourth Color</p>

<form>
    Saturation: <input id=saturation value=75><br>
    Lightness: <input id=lightness value=40><br>
    <input type=submit onclick="javascript:setColors()" value=Update>
</form>

答案 1 :(得分:1)

@Tim Schmelter的评论中提出了这些建议。

这不是理想的,因为它重复,但至少颜色是不同的。

public Color GetNiceColor(int n)
{
    Color[] NiceColors = new Color[]{Color.Red,Color.Yellow,Color.Blue,Color.Green,Color.Brown,Color.DarkGray,Color.Orange,Color.Magenta,Color.Cyan,Color.Magenta,Color.Lime};
    int selection = n % NiceColors.Count();

    return NiceColors[selection];
}

答案 2 :(得分:0)

我不认为这是可能的,因为该序列的颜色不遵循任何顺序。 我找到一个很好的颜色的好方法是找到你喜欢的颜色 - 得到它的3个R,G和B值 - 并且......混合十六进制代码对的顺序。 所以...

Colour1=C4 89 FF
Colour2=C4 FF 89
Colour3=FF 89 C4
Colour4=etc.

我对此没有任何提及 - 因为如果我需要快速的颜色序列,这就是我所做的。

您还可以查看颜色渐变以获得一个很好的序列: 例如。 http://www.pixelfor.me/crc/F0000032

或者众多网站中的一个,人们投票选择一起看起来很好的颜色序列,例如。 http://colorhunt.co/

答案 3 :(得分:0)

这是D.Shawley's answer的C#版本,其中有一些tips of Nolonar

using System.Runtime.InteropServices;

enum E_COLOR_TYPE
{
    DEFAULT,
    FIRST,
    SECOND,
    THIRD,
    //Add more item here...
    TOTAL,
}

static class ColorSetter
{
    [DllImport("shlwapi.dll")]
    private static extern int ColorHLSToRGB(int H, int L, int S);

    private static Color[] s_arrColor;

    static ColorSetter()
    {
        const int COLOR_COUNT = (int)E_COLOR_TYPE.TOTAL;
        s_arrColor = new Color[COLOR_COUNT];
        const int HUE_BASE = (240 / COLOR_COUNT);
        const int LIGHTNESS = 120;
        const int SATURATION = 240;
        for (int i = 0; i < s_arrColor.Length; ++i)
            s_arrColor[i] = ColorTranslator.FromWin32((ColorHLSToRGB(i * HUE_BASE, LIGHTNESS, SATURATION)));
    }

    public static Color GetColorType(E_COLOR_TYPE type)
    {
        return s_arrColor[(int)type];
    }
}

请注意,如果E_COLOR_TYPE中的项目过多,则颜色将不再“漂亮”。到目前为止,使用此代码,颜色对我来说还不错。