2017-07-28 3 views
0

RGBの差に基づいて最も近い色を取得するコードがありますが、濃い青色のような暗い色では、「濃い青色」の代わりに黒を返します。何が起こっているのかを知ってもらうことができますか?最も近い一致を見つけるために、C#の2つの色の間のrgbの違いを使用する方法?

これは、2つの色の間で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)です。したがって、これらの基板の1つが0 、製品全体が0になるので、黒を返すので、黒のRGBコードは0,0,0になります。

私はできるだけ明確にしようとしましたが、少し混乱してもごめんなさい。

+0

これらの色の間の距離*を手動で計算する必要があります。おそらく、濃い青色よりも黒に近いかもしれません。私たちがあなたに恋したいなら、次の情報を提供する必要があります。あなたの「ダークブルー」標準のRGB。暗い青色になることが予想されるときに黒になる色のRGBの例。 –

+1

あなたの説明がコードと一致しません......これらの色のdiff = 0の場合、そのチャンネルの差は0です。これは正しいですが、違いはありません。 0は、まったく色のためではありません。それは奇妙なことにすべてをもう一度行うので、最も低い差のインデックスを見つけることができます –

+1

* "したがって、これらの基材のいずれかが0に等しい場合、製品全体が0になります*" - 間違っています。あなたは色成分の距離の積を使用していないので、それらを合計します。それらのうちの1つがゼロに計算される場合、sumはゼロ以外の値になります。 –

答えて

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

注意。

関連する問題