2017-07-28 286 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; 
} 

注意,不止一種顏色可以有相同的差別。