如何根据C#中的一系列值计算颜色?

jim*_*imj 3 c# colors system.drawing.color

var colors = new Color[] { 
    Color.Blue, 
    Color.Green, 
    Color.Yellow, 
    Color.Orange, 
    Color.Red 
};

var min = 0;
var max = 400;
Run Code Online (Sandbox Code Playgroud)

我试图根据另一个数字得到这些值之间的颜色.因此,例如,如果我想要值350的颜色,它将是50%橙色和50%红色.

编辑 - 为清晰起见重新编辑

我能想到的唯一方法是在photoshop中创建渐变图像,然后计算偏移量并抓取像素RGB值.然而,这似乎非常hacky,我想通过某种计算来做到这一点.

有任何想法吗?

Mar*_*ers 11

您可以使用线性插值来混合R,G和B值(如果需要,还可以使用A).这是Windows窗体项目的一些示例代码.只需添加范围为0到400的轨道栏,并将轨迹栏的滚动事件连接到下面的处理程序:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    byte interpolate(byte a, byte b, double p)
    {
        return (byte)(a * (1 - p) + b * p);
    }

    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        int v = trackBar1.Value;
        BackColor = getColor(v);
    }

    private Color getColor(int v)
    {
        SortedDictionary<int, Color> d = new SortedDictionary<int, Color>();
        d.Add(0, Color.Blue);
        d.Add(100, Color.Green);
        d.Add(200, Color.Yellow);
        d.Add(300, Color.Orange);
        d.Add(400, Color.Red);

        KeyValuePair<int, Color> kvp_previous = new KeyValuePair<int,Color>(-1, Color.Black);
        foreach (KeyValuePair<int, Color> kvp in d)
        {
            if (kvp.Key > v)
            {
                double p = (v - kvp_previous.Key) / (double)(kvp.Key - kvp_previous.Key);
                Color a = kvp_previous.Value;
                Color b = kvp.Value;
                Color c = Color.FromArgb(
                    interpolate(a.R, b.R, p),
                    interpolate(a.G, b.G, p),
                    interpolate(a.B, b.B, p));
                return c;
            }
            kvp_previous = kvp;
        }

        return Color.Black;
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用nobugz建议的HSL颜色.

注意:此代码只是概念验证.在实际应用程序中,您需要创建一个类来封装颜色选择逻辑,使其更具可定制性,以及错误处理等.它还没有针对速度进行优化.如果速度是一个重要的考虑因素,那么您应该使用查找表.