【发布时间】:2011-10-31 16:27:20
【问题描述】:
我想比较颜色,但不知道从哪里开始。我试过了
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);
}
这似乎产生了稍微好一点的结果,但仍然不时穿插着一种奇怪的不合适的亮色(特别是在“较柔和”/“较低值”的颜色区域)。 (如何)我可以改进最后一个结果?
编辑:感谢所有 cmets,我现在了解这个问题可能需要更多背景知识才能让您做出有意义的回答,所以我会详细说明并希望您仍然支持我在回答这个问题。这是我的目标:想象一个像this one 这样的调色板,我想在一个排序列表中表示它。当然调色板是二维的,我的列表是一维的,但我只使用我这样查找的内置颜色
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)));
我正在尝试使用这些颜色生成一个列表,其中颜色按照调色板上的一种颜色相等性进行分组。按亮度排序是次要的,但对于颜色组之间的平滑过渡仍然很重要。
为了清楚起见:对于“颜色平等”和“颜色组”,我指的是示例调色板中视觉上连贯的颜色区域。使用“平滑过渡”,我指的是调色板中视觉连贯的颜色区域之间的区域。我没有使用诸如示例调色板功能之类的大量颜色,我只使用内置颜色(它们似乎具有大量类似奶油色的颜色)。
【问题讨论】:
-
你能不能先给我们一点暗示你到底想做什么? (更准确地说,你想如何定义你的全序或偏序?)
-
另一种思考方式是将颜色想象为 3D 坐标。 2 种颜色之间的差异将是 3D 空间中 2 点之间的距离。
-
你对比较的定义是什么?如果一种颜色更接近黑色,它是否“小于”另一种颜色?
-
您“想知道为什么没有 CompareTo 之类的东西”,但您“不知道从哪里开始?”这是有道理的。
-
如果要按亮度排序,则应将每种颜色转换为其 HSL/HSV 表示,并使用 L/V 分量作为比较的基础(必要时回退 S 和 H .)