2012-07-30 9 views
13

私はイメージの最も使用されている色を見つけるためにアプリケーションを作成しています。色のRGB値を取得するまでですが、色名を取得する方法はplzに役立ちます。C#でRGB値を持っている間に色の名前を取得する方法は?

+2

これは役立ちます。http://stackoverflow.com/questions/365935/trying-to-convert-rgb-from-a-net-color-to-a-string-such-as-red-or-青 – Habib

+0

[何を試しましたか](http://whathaveyoutried.com)?あなたはどこにいるのですか?色が知られている名前のものではない場合、あなたは何が起こると思いますか? – Oded

答えて

2

System.Drawing名前空間のColorクラスを使用できる必要があります.Colorオブジェクトを返す静的メソッドFromARGBがあります。それはあなたがそのようにRGB値を入力することができます1、いくつかのオーバーロードがあります。

var color = Color.FromArgb(100, 5,5,5).Name; 
+0

ドキュメントから: 'このメソッドは、名前から色が作成された場合はユーザー定義の色名、または既知の色の名前を返します。カスタムカラーの場合は、RGB値が返されます。 ' –

+3

** **は「赤」の形式で名前を返しません。あなたの例では、名前は64050505として出てきます。 – adrianbanks

+0

はい、それは16進値を与えています、どのように名前を取得するのですか? – fresky

11

このメソッドは、Colorクラスに定義済みの色を検討し、引数として渡された色に対して、それらを比較するためにリフレクションを使用しています。これはさらに最適化することができますが、それはあなたに一般的なテクニックのアイデアを与えるはずです。コメントで述べたように、KnownColor列挙はこれをより簡単にするために使用することができ

private static String GetColorName(Color color) 
{ 
    var predefined = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static); 
    var match = (from p in predefined where ((Color)p.GetValue(null, null)).ToArgb() == color.ToArgb() select (Color)p.GetValue(null, null)); 
    if (match.Any()) 
     return match.First().Name; 
    return String.Empty; 
} 
+0

'Any'の代わりに' First'の代わりに 'FirstOrDefault'を呼び出し、結果がnullであるかどうかを確認します。 –

+2

色は構造体です。 FirstOrDefaultはnullではなく空の色を返します。 –

20

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Linq; 
using System.Reflection; 

class Test 
{ 
    static void Main() 
    { 
     Color color = Color.FromArgb(255, 0, 0); 
     Console.WriteLine(color.Name); // ffff0000 

     var colorLookup = Enum.GetValues(typeof(KnownValue)) 
       .Cast<KnownColor>() 
       .Select(Color.FromKnownColor) 
       .ToLookup(c => c.ToArgb()); 

     // There are some colours with multiple entries... 
     foreach (var namedColor in colorLookup[color.ToArgb()]) 
     { 
      Console.WriteLine(namedColor.Name); 
     } 
    } 
} 

オリジナル答え

Color.FromArgbはあなたにColorを与えるだろうが、それ決して名前を持つことはありません。あなたは私が知っている限り、名前付きの色を得るために反射を使用する必要があります。ここで私は同時にアップ働いていたコール・キャンベルのソリューションの別のバージョンがあります

...

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Linq; 
using System.Reflection; 

class Test 
{ 
    static void Main() 
    { 
     Color color = Color.FromArgb(255, 0, 0); 
     Console.WriteLine(color.Name); // ffff0000 

     var colorLookup = typeof(Color) 
       .GetProperties(BindingFlags.Public | BindingFlags.Static) 
       .Select(f => (Color) f.GetValue(null, null)) 
       .Where(c => c.IsNamedColor) 
       .ToLookup(c => c.ToArgb()); 

     // There are some colours with multiple entries... 
     foreach (var namedColor in colorLookup[color.ToArgb()]) 
     { 
      Console.WriteLine(namedColor.Name); 
     } 
    } 
} 
+0

[KnownColor enumeration](https://msdn.microsoft.com/en-us/library/system.drawing.knowncolor(v = vs.110).aspx?cs-lang = csharp#code-snippet -2)。 –

+0

@AndrewMorton:良い点 - 編集済み。 –

+0

'KnownColor'は' ActiveCaptionText'のようなシステムカラーを含んでいるので、この場合は本当に役に立たないです。したがって、このメソッドはこれらの名前も返します。 – Karsten

0

迅速かつ簡単なものについては、この(WPFで)試してみてください。

public string GetNameOfColor(Color color) { 
    var colorProperty = typeof(Colors).GetProperties().FirstOrDefault(p => 
     (Color)(p.GetValue(p, null)) == color); 
    return (colorProperty != null) ? colorProperty.Name : color.ToString(); 
} 

Visual Studio 2010では、p.GetValue(p, null)が必要です。 Visual Studio 2013以降では、p.GetValue(p)を使用できます。

この技術の利点は、その簡潔さに加えて、それはSystem.DrawingまたはSystem.Reflectionへの参照を必要としないことであるが、ユーザがWPFでSystem.Windows名前空間、内部に残ることができます。 System.Windows.Mediaへの参照が必要です。これは、WPFの色を使って作業している場合には、すでに持っているはずです。あなたが私のような人であれば、WPFアプリケーションには必要なく、System.Drawingを追加しないでください。 WPF名前空間の内部にいる理由は、その優先事項です。たとえば、WPF v/s System.Drawingのディスカッションを参照してください。

+0

これは他の2つの回答とどのように違いますか?その部分はWPFですか? –

関連する問題