将int值转换为渐变中的颜色

时间:2014-09-29 18:46:01

标签: c# colors gradient heatmap

我有一个int值,范围从-148到10,我正在尝试将此值映射到以下渐变中的颜色:

  • 黑色(-148)
  • 青色
  • 绿色
  • 黄色
  • 红色
  • 怀特(10)

从视觉上看,我的颜色渐变如下所示:

我的第一个想法是将范围(-148到10)分解为对应于这八种颜色的较小组,但这显然会导致多个值转换为相同的颜色。我想在这个渐变中使用更多甚至所有颜色,但我不知道该如何去做。有人可以提供一些建议吗?对于它的价值,我在C#/ .NET中工作,所以我需要将我的int转换为RGB值。

3 个答案:

答案 0 :(得分:2)

您实际上正在查看HSV色彩空间。你能做的是:

1将您的[-148,10]映射到H

中的[0,360]度

2修正S和V值。 (我猜S = 1,V = 1)

3从先前计算的H,S和V中获取HSV颜色

4将HSV颜色转换为RGB颜色并使用。

答案 1 :(得分:2)

你的意思是像这样的映射函数吗? (颜色列表中的透明条目在值为10的情况下为虚拟,其中color1取自列表的第9个条目)

    Color[] colors = new Color[] { Colors.Black, Colors.Blue, Colors.Cyan, Colors.Green, Colors.Yellow, Colors.Orange, Colors.Red, Colors.White, Colors.Transparent };
    public Color IntToColor(int i)
    {
        float scaled = (float)(i + 148) / 158 * 7;
        Color color0 = colors[(int)scaled];
        Color color1 = colors[(int)scaled + 1];
        float fraction = scaled - (int)scaled;
        Color result = new Color();
        result.R = (byte)((1 - fraction) * (float)color0.R + fraction * (float)color1.R);
        result.G = (byte)((1 - fraction) * (float)color0.G + fraction * (float)color1.G);
        result.B = (byte)((1 - fraction) * (float)color0.B + fraction * (float)color1.B);
        result.A = 255;
        return result;
    }

P.S。:为简单起见,没有检查[-148:10]范围 P.P.S。:我知道我的代码不会赢得任何选美比赛。

答案 2 :(得分:1)

您的图片宽度为200,大小为203字节。我会读出159个值并将它们存储在List中。当然你可以用c#来计算它们,但这需要更多的资源,imo ..

    Dictionary<int, Color> mycolors = new Dictionary<int,Color>();
    Bitmap bmp = new Bitmap("D:\\spectrum.png");

    float fx = bmp.Width / 159f;
    for (int x = 0; x < 160; x++)
        mycolors.Add(x - 148, bmp.GetPixel((int)(fx * x), 1));

这将映射159种颜色。如果您想要超过这些(或者您的图像保持200个),则需要进行计算。但是你无法将它们映射到你的整数范围 - 所以请你下定决心! Here是实现HSV-> RGB映射的代码,您可以使用它,至少从蓝色变为红色。黑色和白色的衰落必须来自两个以上的例程。最好的方式是Fratyx的插值代码。 (因为它会从每个部分的最清晰颜色的外环切开一点点。)