18

画像の最も使用されている色を見つけるためのアプリケーションを作成しています。色の RGB 値を取得していますが、色名を取得する方法については、plz を助けてください。

4

6 に答える 6

24

コメントに記載されているように、KnownColor列挙を使用してこれを簡単にすることができます。

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(KnownColor))
               .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が、名前はありません。私の知る限り、名前付きの色を取得するにはリフレクションを使用する必要があります。

これは、私が同時に取り組んでいたCole Campbellのソリューションの別のバージョンです...

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);
        }
    }
}
于 2012-07-30T19:39:48.580 に答える
14

このメソッドは、リフレクションを使用してクラスの定義済みの色を調べ、Color引数として渡された色と比較します。これはさらに最適化することができますが、一般的な手法についてのアイデアが得られるはずです。

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;
}
于 2012-07-30T19:37:20.410 に答える
2

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

var color = Color.FromArgb(100, 5,5,5).Name;
于 2012-07-30T19:29:54.777 に答える