【问题标题】:Ordering Color by Hex Value按十六进制值排序颜色
【发布时间】:2016-09-25 16:27:28
【问题描述】:

我不知道如何对这个问题进行分类,也不能有效地解释它,但我会尽力而为。

我从我的应用中收集了一系列随机十六进制代码值。

我想以渐变的形式呈现这些颜色,这将(理论上)显示一组颜色的显着性。

如果在我的随机颜色数组中有更多的蓝色阴影,那么将它放入这个渐变中就会反映出来。

但首先,我需要将渐变中的颜色“排序”到喜欢的颜色旁边。

我正在使用 C# -- 但更重要的是,在关于如何将十六进制颜色值映射/排序/组合在一起的理论之后。

【问题讨论】:

  • 这些值的格式是什么?它是 .net Drawing.Color 还是只是文本?
  • 您可以将它们转换为 HSV 并按色调排序。
  • 不可能有真正的顺序,因为颜色空间是 3d,线性渐变是 1d。所以你需要投影 3d -> 1d。转换为 Color 或 HSV 是很好的第一步,但您必须做出决定。请参阅 here for a discussion of color distance
  • @llouk 我将十六进制值作为字符串
  • @DavidConrad 这听起来很有趣,你有链接吗?谢谢:)

标签: c# colors gradient rgb color-theory


【解决方案1】:

感谢 cmets,我使用了 Hue 方法作为评论,结果如下 - 效果很好,你可以看到我的颜色列表中有更多蓝色(动态设置)再次感谢。

但它仍然存在一个错误 - 它正在重复而不是由于某种原因占据整个高度:((从蓝色到红色应该只有 1 个线性)

(我将为此打开另一个问题)。

我的代码如下(ColorFromString 是我为this question写的一个方法):

private Color[] OrderColorByHue(List<string> colors)
{
  foreach(string c in colors)
  {
    Color color = ColorFromString(c); // This was defined in another question of mine :)
    float hue = color.GetHue();

    hueColors.Add(new KeyValuePair<Color, float>(color, hue));
  }

  hueColors.Sort((color1, color2) => color2.Value.CompareTo(color1.Value));
  Color[] value = hueColors.Select(color => color.Key).ToArray();

  return value;
}

希望这对其他人有帮助:)

【讨论】:

  • 这可以更简洁地写成:return colors.Select(ColorFromString).OrderBy(c => c.GetHue()).ToArray()
【解决方案2】:
    // GET: Admin/Colors
    public ActionResult Index()
    {
        var colors = db.Colors.OrderBy(a => a.HexCode);
        return View(colors);
    }

我在我的 MVC.Net 项目中使用了它。 我想你可以自己修改它。

HexCodes 必须以“#”开头(对排序很重要)

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 2011-11-18
    • 2019-06-16
    • 2021-03-08
    • 2019-10-29
    • 2014-07-03
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多