按颜色相等分组的内置颜色列表

时间:2011-10-31 16:27:21

标签: c# colors compareto

我想比较颜色,但还没有线索从哪里开始。我试过了

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);
}

这似乎会产生稍微好一些的结果,但仍然会不时地散布出奇怪的不合适的亮色(特别是在'较软'/'较低值'颜色区域)。 (如何)我可以改进最后的结果?

编辑:感谢所有评论,我现在明白这个问题可能需要一些更多的背景知识才能产生有意义的回复,所以我会详细说明并希望你还在我回答这个问题。这是我的目标:想象一下像this one这样的调色板,我想在排序列表中表示这一点。当然,调色板是2D,我的列表是1D,但我只使用我这样查找的内置颜色

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)));

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

为了清楚起见:使用'颜色相等'和'颜色组'我指的是样本颜色调色板中的视觉连贯颜色区域。 '平滑过渡'我指的是视觉上连贯的颜色区域之间的调色板中的区域。我没有使用各种各样的颜色,例如样本调色板功能,我只使用内置颜色(看起来具有大量奶油般的颜色)。

1 个答案:

答案 0 :(得分: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;
}