/// <summary>
/// 颜色扩展类
/// </summary>
public static class ColorExtensions
{
/// <summary>
/// .NET预定义的系统颜色缓存列表
/// </summary>
private static readonly Dictionary<int, Color> ColorCache; /// <summary>
/// 拥有相同颜色代码值的系统颜色名称列表
/// </summary>
private static readonly Dictionary<int, string[]> DuplicateColorNameCache; /// <summary>
/// 静态构造函数
/// </summary>
static ColorExtensions()
{
ColorCache = new Dictionary<int, Color>();
DuplicateColorNameCache = new Dictionary<int, string[]>(); Type type = typeof(Color);
var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase);
foreach (var propertyInfo in properties)
{
var value = propertyInfo.GetValue(null, null);
if (value is Color)
{
var color = (Color) value;
var intCode = color.ToIntCode();
if (!ColorCache.ContainsKey(intCode))
{
ColorCache.Add(intCode, color);
}
else
{
if (DuplicateColorNameCache.ContainsKey(intCode))
{
var values = DuplicateColorNameCache[intCode].ToList();
values.Add(color.Name);
DuplicateColorNameCache[intCode] = values.ToArray();
}
else
{
string[] values = { ColorCache[intCode].Name, color.Name };
DuplicateColorNameCache[intCode] = values;
}
}
}
}
} /// <summary>
/// 返回用十进制格式的颜色值,该值范围在0~16777215。
/// <para>例:0表示黑色,16777215表示白色。</para>
/// </summary>
/// <param name="color">Color对象</param>
/// <returns>十进制格式的颜色值</returns>
public static int ToIntCode(this Color color)
{
int c = color.R;
c = c | color.G << ;
c = c | color.B << ; return c; //以下代码等效
//先转成16进制值,再转成10进制值
//var hexCode = color.ToHexCode(false);//获取十六进制格式的颜色代码值
//int intCode = Convert.ToInt32(hexCode, 16);//获取十进制格式的颜色代码值
} /// <summary>
/// 返回十六进制格式的颜色值。
/// <para>例:Color.Gray(灰色)返回#808080。Color.FromArgb(192,192,192) 返回#C0C0C0</para>
/// </summary>
/// <param name="color">Color对象</param>
/// <param name="isAddPrefix">是否添加前缀"#", 默认为 true。</param>
/// <returns>十六进制格式的颜色值</returns>
public static string ToHexCode(this Color color, bool isAddPrefix = true)
{
return string.Format("{0}{1:X2}{2:X2}{3:X2}", isAddPrefix ? "#" : string.Empty, color.R, color.G, color.B); //下面这个方法,遇到.NET预定义的颜色对象,会返回颜色名称,而不是十六进制值。
//return ColorTranslator.ToHtml(color);
} /// <summary>
/// 返回HTML支持的颜色代码值,如果颜色已在HTML预定义,则返回颜色名称,否则返回十六进制格式表示的代码值。
/// <para>例:Color.Gray(灰色)返回Gray。Color.FromArgb(192,192,192) 返回#C0C0C0(银白色)</para>
/// <para>例:这是因为HTML中已预定义该颜色代码值,所以HTML支持该颜色代码值所对应的名称值。</para>
/// <para>.NET有三对预定义颜色的代码值是相同的,所以当传入以ARGB表示的颜色对象刚好在这三对预定义颜色范围,那么只会返回一对中的其中一个颜色名称。</para>
/// <para>当你需要知道另外一个颜色名称,你可以通过</para>
/// </summary>
/// <param name="color">Color对象</param>
/// <returns>如果颜色已在HTML预定义,则返回颜色的友好名称,否则返回十六进制格式表示的代码值</returns>
public static string ToHtmlCode(this Color color)
{
int intCode = color.ToIntCode();
if (ColorCache.ContainsKey(intCode))
{
return ColorTranslator.ToHtml(ColorCache[intCode]);
}
/*
* 上面之所以要这样做,是因为当使用者传过来一个使用ARGB表示的Color对象。
* 经过以上处理后,下面可以顺利返回颜色的名称。
* 例: Color color1 = Color.Gray; //灰色
* Color color2 = Color.FromArgb(color1.A, color1.R, color1.G, color1.B);
* color1.ToHtmlCode() 返回"Gray"
* color2.ToHtmlCode() 返回"#808080".
* 其实以上两个Color对象是相等的,这两个对象调用ToHtmlCode()扩展方法都应该返回同一个结果才是比较合理的。
*/
return ColorTranslator.ToHtml(color);
} /// <summary>
/// 获取具有相同代码值的颜色名称数组,如果没有,则返回null。
/// </summary>
/// <param name="color">Color对象</param>
/// <returns>返回具有相同代码值的颜色名称数组,如果没有,则返回null。</returns>
public static string[] GetDuplicateColorNames(this Color color)
{
int intCode = color.ToIntCode();
if (DuplicateColorNameCache.ContainsKey(intCode))
{
return DuplicateColorNameCache[intCode];
} return null;
} /// <summary>
/// 转换十进制格式的颜色代码值为Color对象
/// </summary>
/// <param name="intCode">十进制格式的颜色代码值</param>
/// <returns>返回Color对象</returns>
public static Color IntToColor(int intCode)
{
if (ColorCache.ContainsKey(intCode))
{
return ColorCache[intCode];
}
/*
* 以上处理与ToHtmlCode方法同理
* 先检查是否与.NET预定义的颜色匹配,如果匹配,返回.NET预定义的颜色对象(该对象包含一个可被直接理解的颜色友好名称)。
* 如果不匹配,则返回用ARGB表示的Color对象。
*/
string hexCode = Convert.ToString(intCode, );
return ColorTranslator.FromHtml("#" + hexCode);
} /// <summary>
/// 转换以"#"开头的六位长度的十六进制格式的颜色代码值或.NET预定义的颜色名称为Color对象
/// </summary>
/// <param name="hexCodeOrColorName">.NET预定义的颜色名称或以"#"开头的6位长度的十六进制颜色代码值</param>
/// <returns></returns>
public static Color HexOrNameToColor(string hexCodeOrColorName)
{
if (string.IsNullOrEmpty(hexCodeOrColorName))
{
return Color.Empty;
} try
{
//This is hex code.
if (hexCodeOrColorName[] == '#')
{
string hexCode = hexCodeOrColorName.Substring();
int intCode = Convert.ToInt32(hexCode, );
if (ColorCache.ContainsKey(intCode))
{
//返回拥有友好名称的Color对象
return ColorCache[intCode];
} //返回以ARGB表示的Color对象
return ColorTranslator.FromHtml(hexCodeOrColorName);
} //This is color name.
return ColorTranslator.FromHtml(hexCodeOrColorName);
}
catch (Exception)
{
return Color.Empty;
}
}
}

颜色扩展类--ColorExtensions的更多相关文章

  1. C# 扩展类

    C# 中提供一个非常实用的供能,扩展方法(Extension method) 扩展方法是通过额外的静态方法扩展现有的类型.通过扩展方法,可以对已有类型做自己想做的相关扩展.方法:定义静态类,扩展方法也 ...

  2. tp中调用PHP系统扩展类

    例如使用Redis扩展类: use Reids; $redis = new Redis();

  3. Java+7入门经典 - 6 扩展类与继承 Part 1/2

    第6章 扩展类与继承 面向对象编程的一个重要特性: 允许基于已定义的类创建新的类; 6.1 使用已有的类 派生 derivation, 派生类 derived class, 直接子类 direct s ...

  4. Thinkphp编辑器扩展类kindeditor用法

    一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp站点项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们拷贝到你的站点项目的Th ...

  5. 扩展javascript扩展(类,对象,原型)

     扩展javascript扩展(类,对象,原型)

  6. PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载

    文章转载自:https://my.oschina.net/junn/blog/104464 PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PH ...

  7. ASP.NET MVC4 HtmlHelper扩展类,实现分页功能 @Html.ShowPageNavigate

    本文主要做了一个HtmHelper类的分页扩展函数,方便在视图中调用,有需要的朋友可以参考一下,希望对大家有所帮助. 1.扩展HtmlHelper类方法ShowPageNavigate output. ...

  8. C#操作Xml树的扩展类

    本文提供一个操作Xml树的扩展类,与将xml字符串直接映射成实体对象的使用方法,供大家参考,学习. 下面附上源码 using System; using System.Collections.Gene ...

  9. 基于Thinkphp3.2的qq第三方oauth认证登录扩展类

    基于Thinkphp3.2的qq第三方oauth认证登录扩展类,由于腾讯oauth sdk写的太多,不能与thinkphp和好的结合,最终想法讲腾讯oauth sdk写成tp的扩展类先看代码,将代码保 ...

随机推荐

  1. [ICPC 北京 2017 J题]HihoCoder 1636 Pangu and Stones

    #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...

  2. 域渗透分析神器BloodHound

    一.安装过程: 1.首先安装JDK,要求是JDK8 JDK8下载地址 windows下按照提示自动安装好久可以了 2.安装neo4j neo4j图数据库下载地址 下载好后,进入对应的目录在命令行运行如 ...

  3. Centos下普通用户设置sudo权限

    若执行sudo命令的用户没有sodu权限,则会报以下错误 violet is not in the sudoers file.This incident will be reported 若想让vio ...

  4. hdu 1241(DFS/BFS)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  5. linux 安装配置nexus以及maven私服应用

    ---------------------nexus---------------------- 1.编辑nexus脚本, 配置 RUN_AS_USER 参数vi /usr/local/src/nex ...

  6. hibernate11--Criteria查询

    public class EmpTest { Session session =null; Transaction transaction=null; @Before public void befo ...

  7. 利用pl/sql执行计划评估SQL语句的性能简析

    一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在.  那么,作为 ...

  8. ClientImageViewController

    package com.vcredit.ddcash.server.web.controller.common; import com.vcredit.ddcash.server.commons.mo ...

  9. http 你造吗?

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...

  10. 7.1-uC/OS-III中断管理

    在 uC/OS 系统中,中断相当于一个优先级最高的任务.中断一般用于处理比较紧急的事件, 而且只做简单处理,例如标记该事件,带退出中断后再做详细处理.在使用 uC/OS系统时, 一般建议使用信号量. ...