2017-07-28 283 views
0

我有一个代码可以根据RGB差异获得最接近的颜色,但是深蓝色等深色,它会返回黑色而不是“深蓝色”。你们能帮我弄清楚发生了什么吗?如何使用C#中两种颜色之间的rgb差异来找到最接近的匹配?

这是计算两个颜色之间的RGB差异代码:

int ColorDiff(Color c1, Color c2) 
{ 
    return (int)Math.Sqrt((c1.R - c2.R) * (c1.R - c2.R) 
         + (c1.G - c2.G) * (c1.G - c2.G) 
         + (c1.B - c2.B) * (c1.B - c2.B)); 
} 

此代码获取列表中最接近的颜色(即具有RGB之间差异较小的一个):

int encontrarCor(List<Color> colors, Color target) 
{ 
    var colorDiffs = colors.Select(n => ColorDiff(n, target)).Min(n => n); 
    return colors.FindIndex(n => ColorDiff(n, target) == colorDiffs); 
} 

我认为,正如你在第一个代码中看到的那样:(c1.R - c2.R)*(c1.R - c2.R),所以如果其中一个基底等于0 ,整个产品将为0,因此返回黑色,导致黑色RGB代码为0,0,0。

我试图让自己变得尽可能清楚,对不起,如果有点困惑。

+0

您需要手动计算这些颜色之间的*距离* - 也许,它实际上更接近黑色而不是深蓝色。如果您希望我们提供您,那么您需要提供以下信息:“深蓝色”标准的RGB;颜色的RGB示例,当您希望它变成深蓝色时会导致黑色。 –

+1

您的描述与代码不匹配......如果其中一个颜色差异= 0,则该通道的差值为0,这是正确的,没有差别。这0完全不用于颜色。然后奇怪地再次这样做,所以它可以找到具有最低差异的颜色索引 –

+1

*“因此,如果其中一个基底等于0,则整个产品将是0”* - 错误。你没有使用颜色分量的距离的产品,你总结一下。如果其中一个计算为零,则总和仍然可以不为零。 –

回答

0

我没有得到平方根和乘法的点,但差异应该是积极的:

int RGBdiff(Color c1, Color c2) 
{ 
    return Math.Abs(c1.R - c2.R) + Math.Abs(c1.G - c2.G) + Math.Abs(c1.B - c2.B); 
} 

Color ClosestColor(Color target, IEnumerable<Color> colors) 
{ 
    return colors.Min(c => Tuple.Create(RGBdiff(c, targert), c)).Item2; 
} 

注意,不止一种颜色可以有相同的差别。