2011-10-31 65 views
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); 
} 

这似乎产生略微更好的结果,但具有奇怪外的地方亮彩色静止穿插不时(特别是在“较软的” /“下限值”的颜色区域) 。 (如何)可以改进最后的结果?

编辑:感谢所有的意见,我现在明白这个问题可能需要一些更多的背景让你能够产生有意义的回应,所以我会详细说明,并希望你仍然与我一起回答这个问题。这是我的目标:想像一个像this one这样的调色板,我想在一个排序列表中表示这个。当然调色板是2D的,我的名单是一维,但我只工作了内置的,我查找这样

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

的色彩和那些颜色我想产生一个列表,其中的颜色按照调色板上的一种颜色平等进行分组。按亮度排序是次要的,但对于颜色组之间的平滑过渡仍然很重要。为了清楚起见:'颜色平等'和'颜色组'我指的是样本调色板中视觉上一致的颜色区域。 '平滑过渡'我指的是在视觉上一致的颜色区域之间的调色板区域。我没有使用各种各样的颜色,例如样本颜色调色板功能,我只使用内置颜色(似乎具有许多类似奶油色的颜色)。

+0

如何计算每个组件的差异? (虽然不确定当红色差异为-10时,它的表现如何,例如蓝色差异为10)。这个想法的一个变种可以工作。 –

+2

您能否给我们提供您想要做什么的最微小暗示? (更确切地说,您想如何定义全部或部分排序?) –

+1

另一种想法是将颜色想象为3D坐标。 2种颜色之间的差异将是3D空间中2个点之间的距离。 –

回答

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; 
} 
+0

谢谢,但出现这种情况以产生与字符串比较方法完全相同的结果 – mtijn