0

我想比较颜色,但不知道从哪里开始。我试过了

private static int CompareColors(Color colorA, Color colorB)
{
    long resultA = colorA.A + colorA.B + colorA.G + colorA.R;
    long resultB = colorB.A + colorB.B + colorB.G + colorB.R;
    return (int)Math.Max(-1, Math.Min(1, resultA - resultB));
}

但所做的只是比较总“颜色值”而不考虑不同通道的差异,并产生一种从暗到亮的列表。所以我尝试了

private static int CompareColors(Color colorA, Color colorB)
{
    string resultA = colorA.Tostring();
    string resultB = colorB.Tostring();
    return string.Compare(resultA, resultB);
}

这似乎产生了稍微好一点的结果,但仍然不时穿插着一种奇怪的不合适的亮色(特别是在“较柔和”/“较低值”的颜色区域)。(如何)我可以改进最后一个结果吗?

编辑:感谢所有评论,我现在明白这个问题可能需要更多背景知识才能让你做出有意义的回应,所以我会详细说明并希望你仍然和我一起回答这个问题。这是我的目标:想象一个像这样的调色板,我想在一个排序列表中表示它。当然调色板是二维的,我的列表是一维的,但我只使用我这样查找的内置颜色

List<Color> colors = new List<Color>();
Type colorType = typeof(Colors);
foreach (PropertyInfo propertyInfo in colorType.GetProperties(BindingFlags.Public | BindingFlags.Static))
{
    if (propertyInfo.PropertyType == typeof(Color))
    {
        colors.Add((Color)propertyInfo.GetValue(null, null));
    }
}
colors.Sort(new Comparison<Color>((colorA, colorB) => CompareColors(colorA, colorB)));

并且使用这些颜色,我试图生成一个列表,其中颜色按照调色板上的一种颜色相等性进行分组。按亮度排序是第二个,但对于颜色组之间的平滑过渡仍然很重要。

为了清楚起见:对于“颜色平等”和“颜色组”,我指的是示例调色板中视觉上连贯的颜色区域。使用“平滑过渡”,我指的是调色板中视觉连贯的颜色区域之间的区域。我没有使用诸如示例调色板功能之类的各种各样的颜色,我只使用内置颜色(它们似乎具有大量的奶油色)。

4

1 回答 1

3

如果您需要任意排序,您可以以任何方式实现它。例如:

private static int CompareColors(Color colorA, Color colorB)
{
  if (colorA.A > colorB.A)
    return 1;
  if (colorA.A < colorB.A)
    return -1;

  if (colorA.R > colorB.R)
    return 1;
  if (colorA.R < colorB.R)
    return -1;

  if (colorA.G > colorB.G)
    return 1;
  if (colorA.G < colorB.G)
    return -1;

  if (colorA.B > colorB.B)
    return 1;
  if (colorA.B < colorB.B)
    return -1;

  return 0;
}
于 2011-10-31T16:39:13.860 回答