Jon*_*eet 22
如注释中所述,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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
原始答案
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Col*_*ell 12
此方法使用反射检查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;
}
Run Code Online (Sandbox Code Playgroud)
您应该能够使用 System.Drawing 命名空间中的 Color 类,它有一个返回 Color 对象的静态方法 FromARGB。它有几个重载,其中一个允许您输入 RGB 值,如下所示:
var color = Color.FromArgb(100, 5,5,5).Name;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12438 次 |
| 最近记录: |