2016-01-19 15 views
10

私は色のリストが2つあり、それらを比較する必要があります。私は色を比較する機能を持っていますが、私はちょっと機能が得られる種類を混同しています。それらをキャストする方法?ここで2つの色のリストを比較してください

public bool AreColorsSimilar(Color c1, Color c2, int tolerance) 
{ 
    return Math.Abs(c1.R - c2.R) < tolerance && 
      Math.Abs(c1.G - c2.G) < tolerance && 
      Math.Abs(c1.B - c2.B) < tolerance; 
} 

は私の最初のリストである:

public static List<Color> PaletteOfSeasons() 
{ 
    List<Color> springColors = new List<Color>(); 

    springColors.Add(ColorTranslator.FromHtml("#80a44c")); 
    springColors.Add(ColorTranslator.FromHtml("#b4cc3a")); 


    return springColors; 
} 

そして別のリストに私がイメージからピクセルを引っ張っています:

public static IEnumerable<Color> GetPixels(Bitmap bitmap) 
{ 
    for (int x = 0; x < bitmap.Width; x++) 
    { 
     for (int y = 0; y < bitmap.Height; y++) 
     { 
      Color pixel = bitmap.GetPixel(x, y); 
      yield return pixel; 
     } 
    } 
} 

そして質問は、私は、この色を比較することができますどのように、ありますか?

+1

何を*結果*比較して何をしたいですか?あなたは* List *をソートしようとしていますか?重複を削除しますか? –

+3

サイドノート:再作成され、メソッドから返される 'List 'を受け取る方法はありますか?パラメータは必要ありません。 –

+0

私の静的な色を任意の画像の色と比較する類似の色を探したい – cygnus

答えて

2

私は右のあなたを理解していれば:

var springColors = null; 
springColors = PaletteOfSeasons(springColors); 

var similarColors = GetPixels(bitmap).Intersect(springColors, new ColorComparer(tolerance)); 

そして、あなたは、このクラスが必要:

public class ColorComparer : IEqualityComparer<Color> 
{ 
    private _tolerance; 

    public ColorComparer(int tolerance) 
    { 
     _tolerance = tolerance; 
    } 

    public bool Equals(Color x, Color y) 
    { 
     return AreColorsSimilar(x, y, _tolerance); 
    } 

    public int GetHashCode(Foo x) 
    { 
     return 0; 
    } 

    private bool AreColorsSimilar(Color c1, Color c2, int tolerance) 
    { 
     return Math.Abs(c1.R - c2.R) < tolerance && 
      Math.Abs(c1.G - c2.G) < tolerance && 
      Math.Abs(c1.B - c2.B) < tolerance; 
    } 
} 

P.S.あなたのメソッドPaletteOfSeasonsはちょっと混乱します。メソッドを愚かにメソッドに渡す。

P.P.S. Bitmap.LockBits()を使用してコードのパフォーマンスを向上させます。

P.P.P.S.このようなGetHashCodeの実装は良くありません。しかし、私たちの状況ではそれは問題ありません。

+1

また、私はIEqualityComparerを使用していますが、問題のある 'GetHashCode'のために私はそれを使用しませんでした。あなたの*実装*はすべての必要なニーズを満たしていますが、辞書で使用するとパフォーマンスはかなり悪いO(n)に落ちます。したがって、IMHOはより良いGetHashCode(難しい)を実装するか、メソッドをより明示的に使用します。 – Oliver

+0

@aardia、Yeh、より良いコールコンフォーマーColorSimilarityComparer ... – fryday

0

は単にパレット内のすべての色を持つビットマップのすべてのピクセルを比較する:

foreach(var pixel in GetPixels(myBitmap)) 
{ 
    foreach(var candidate in paletteOfSeasons) 
    { 
     if(AreColorsSimilar(pixel, candidate, 42) 
     { 
      // Hooray, found some similar colors. 
     } 
    } 
} 
関連する問題