【问题标题】:Converting int value to a color in a gradient将 int 值转换为渐变中的颜色
【发布时间】:2014-11-24 05:55:52
【问题描述】:

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

  • 黑色 (-148)
  • 蓝色
  • 青色
  • 绿色
  • 黄色
  • 橙色
  • 红色
  • 白色 (10)

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

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

【问题讨论】:

  • 如果你的范围是[0,255],你知道答案吗?
  • 我不会,看着黑白的起点和终点。
  • 您的图片宽度为 200,大小为 203 字节。我会读出 159 个值并将它们存储在 List 中。当然,您可以在 c# 中计算它们,但这会占用更多资源,imo..

标签: c# colors gradient heatmap


【解决方案1】:

您的意思是像这样的映射函数吗? (颜色列表中的透明条目在值为 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.:我知道我的代码不会赢得任何选美比赛。

【讨论】:

  • 这适用于那些相邻的颜色。您可能想查看this 的帖子,以了解混合 rgb 组件和混合色相的比较。
【解决方案2】:

您实际上是在查看 HSV 颜色空间。你可以做的是:

1 将 [-148,10] 映射到 H 中的 [0,360] 度

2 修正 S 和 V 值。 (我猜你的情况是 S=1 和 V=1)

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

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

【讨论】:

    【解决方案3】:

    您的图片宽度为 200,大小为 203 字节。我会读出 159 个值并将它们存储在一个列表中。当然,你可以在 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 的插值代码的方式。 (因为它会从每个段的最清晰颜色的外环上切掉一点..)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 2022-01-22
      • 1970-01-01
      • 2014-04-30
      • 2013-03-21
      • 1970-01-01
      • 2011-11-30
      • 2022-11-17
      相关资源
      最近更新 更多