今天写了段C#代码,用于解决以下问题:
给定一个颜色,要找到有哪些.NET中自带的颜色与之相似,这里说的.NET自带的颜色,指类似Color.Blue、Color.Black这样的存在于Color结构中的Color类型公开静态属性。比如我要查询的颜色RGB值分别为135、112、155,那么在RGB值各上下浮动30点的范围内,应获得Color.Gray(128,128,128)、Color.LightSlateGray(119,136,153)、Color.SlateGray(112,128,144)三类相似的颜色。
建立一个C#命令行应用程序,手动添加引用System.Drawing用于支持Color类,然后输入如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing; //需要手动添加引用System.Drawing
namespace ColorSearcher
{
class Program
{
static void Main(string[] args)
{
int interval = 30; //RGB差异均小于此值的颜色将被判断为相似颜色
Color colorToSearch = default(Color); //用于存储用户录入的颜色
bool isInputLegal = false; //用于校验用户录入结果是否合法
if (args.Length == 1) //用法1:ColorSearcher HTML颜色代码(如#ABABAB)
{
try
{
colorToSearch = ColorTranslator.FromHtml(args[0]);
isInputLegal = true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
else if (args.Length >= 3) //用法2:ColorSearcher R G B(如 171 171 171)
{
try
{
int r = int.Parse(args[0]);
int g = int.Parse(args[1]);
int b = int.Parse(args[2]);
colorToSearch = Color.FromArgb(r, g, b);
isInputLegal = true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return;
}
}
//非法输入,显示帮助
if (!isInputLegal)
{
Console.WriteLine("用法1:ColorSearcher HTML颜色代码(如#ABABAB)");
Console.WriteLine("用法2:ColorSearcher R G B(如 171 171 171)");
return;
}
Console.WriteLine("指定颜色");
Console.WriteLine(colorToSearch);
//链表:用于存储从Color类中反射出的所有颜色
LinkedList<Color> colors = new LinkedList<Color>();
Type t = typeof(System.Drawing.Color);
System.Reflection.PropertyInfo[] properties = t.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
if (property.PropertyType.ToString() == "System.Drawing.Color")
{
colors.AddLast((Color)property.GetValue(t, null));
}
}
//查找相似颜色
Console.WriteLine("相似颜色");
bool hasFinded = false;
foreach (Color color in colors)
{
if (Math.Abs(colorToSearch.R - color.R) < interval &&
Math.Abs(colorToSearch.G - color.G) < interval &&
Math.Abs(colorToSearch.B - color.B) < interval)
{
Console.WriteLine(color + String.Format("[{0}, {1}, {2}]", color.R, color.G, color.B));
hasFinded = true;
}
}
if (!hasFinded)
{
Console.WriteLine("未找到");
}
}
}
}
这段代码有两种用法:
1、用法1:ColorSearcher HTML颜色代码(如#ABABAB)
2、用法2:ColorSearcher R G B(如 171 171 171)
运行效果如下:
END