颜色扩展类--ColorExtensions

/// <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 << 8;
        c = c | color.B << 16;

        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, 16);
        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[0] == ‘#‘)
            {
                string hexCode = hexCodeOrColorName.Substring(1);
                int intCode = Convert.ToInt32(hexCode, 16);
                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;
        }
    }
}
时间: 2024-11-06 22:04:05

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

自写常用扩展类

好久没有写博客了,今天闲着没事就把前一段时间写的几个扩展类发一下.主要写了三个扩展类. 一.UIColor+WCYAdd 这个类主要是为系统的UIColor添加一些自定方法.在这里我添加了一个生成随机颜色和根据十六进制生成颜色两个方法. /** 生成随机颜色,并返回 @return 随机颜色 */ + (UIColor *)randomColor; /** 根据16进制取颜色 支持@"#123456". @"0X123456". @"123456"

ios 中Category类别(扩展类)专题总结

原创地址   http://www.code4blog.com/archives/294 类别 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类. 类别使得无需创建对象类的子类就能完成同样的工作 一.创建类别 1.声明类别 声明类别与声明类的形式很相似 @interface  NSString(NumberConvenienc

UI(UGUI)框架(二)-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类

UIManage单实例: 1 /// 单例模式的核心 2 /// 1,定义一个静态的对象 在外界访问 在内部构造 3 /// 2,构造方法私有化 4 5 private static UIManager _instance; 6 7 public static UIManager Instance 8 { 9 get 10 { 11 if (_instance == null) 12 { 13 _instance = new UIManager(); 14 } 15 return _instan

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 &amp;&amp; Linux下的ZipArchive配置开启压缩

PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流.这里整理一下常用的示例供参考. 一.解压缩zip文件 ? 1 2 3 4 5 6 7 8 9 10 11 $zip = new ZipArchive;//新建一个ZipArchive的对象 /* 通过ZipArchive的对象处理zip文件 $zip->open这个方法的参数表示处理的

NSJSONSerialization(category)的一个扩展类

.h文件 // // NSJSONSerialization+Manage.h // SVPullToRefreshDemo // // Created by Fuer on 14-7-4. // Copyright (c) 2014年 Home. All rights reserved. // #import <Foundation/Foundation.h> /** * The domain for NSErrors generated by the NSJSONSerialization

R语言结合RColorBrewer颜色扩展包绘制横向直方图

首先载入颜色扩展包RColorBrewer,颜色包的具体使用方法可参见这篇文章http://book.2cto.com/201408/45552.html library(RColorBrewer) 本文以hadoop集群wordcount程序的输出结果为数据源 数据的整理代码如下 x=read.delim("C:/Users/a/Desktop/sample.txt",header=FALSE) #读入文本数据 names(x)=c("word","co

HTML扩展类的所有方法都有2个参数:

——摘自Rocky Ren 以textbox为例子 public static string TextBox( this HtmlHelper htmlHelper, string name, Object value, IDictionary<string, Object> htmlAttributes ) public static string TextBox( this HtmlHelper htmlHelper, string name, Object value, Object h

“XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题

“XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题 原因:设计页面继承的路径和后台.cs页面类的路径不一致造成的 看下图 这个是设计页面的样式 这个是后台cs文件代码 如果这两地方的路径不一致则会导致上述错误出现 解决方法:将这两个地方的路径统一即可解决

Thinkphp编辑器扩展类kindeditor使用方法

一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp网站项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们复制到你的网站项目的ThinkPHP\Lib\ORG\Net 文件夹下. 2,editor文件夹是kindeditor的核心包.将其复制到你项目的Public文件夹下(和入口文件同级的那个Public),并在Public下再建立一个Upload文件夹,用于存放使用编辑器上传的图片. 3,KeditorAction.clas