欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度

程序员文章站 2022-07-10 22:58:29
随机颜色在日常开发中很常用到,有时候要控制颜色明亮度,比如在白色背景网页上的随机颜色,一般要求颜色稍微暗一些,如果生成太亮的颜色会造成阅读困难,再比如你想判断生成的背景色是暗色还是亮色,以决定前景色是白色还是黑色. 采用YUV颜色模式来进行判断会比较合理与直观. YUV是被欧洲电视系统所采用的一种颜 ......

  随机颜色在日常开发中很常用到,有时候要控制颜色明亮度,比如在白色背景网页上的随机颜色,一般要求颜色稍微暗一些,如果生成太亮的颜色会造成阅读困难,再比如你想判断生成的背景色是暗色还是亮色,以决定前景色是白色还是黑色.

  采用YUV颜色模式来进行判断会比较合理与直观.

    

  YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间。在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号B-Y(即U)、R-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。

 

  以上红色部分解释了这个方法的合理性与准确性,具体的信息可以搜索YUV来进行更进一步的了解,RGB可以换算成YUV值,其中,我们只需要利用Y值即可,其他的暂时不用理会,换算公式如下:

  Y = 0.299R + 0.587G + 0.114B 

  两点:1 Y值范围为0-255

             2 Y值越大,颜色越亮

  核心代码部分:

     /// <summary>
        /// 根据自定义范围生成颜色
        /// </summary>
        /// <param name="start">起始数值 0-255</param>
        /// <param name="end">结束数值 0-255</param>
        /// <returns>Color</returns>
        private static Color MarkColor(int start,int end)
        {
 
            if (start < 0 || start > 255) throw new Exception("起始数值只能为0-255之间的数字");
            if (end < 0 || end > 255) throw new Exception("结束数值只能为0-255之间的数字");
            if (start > end) throw new Exception("起始数值不能大于结束数值");
 
 
            Random ran = new Random(Guid.NewGuid().GetHashCode());
 
            int R, G, B;
            double Y;            
            bool result;
 
            do
            {
                R = ran.Next(0, 255);
                G = ran.Next(0, 255);
                B = ran.Next(0, 255);
 
                //Y值计算公式
                Y = 0.299 * R + 0.587 * G + 0.114 * B;
 
                result = Y >= start && Y <= end;
            } while (!result);
 
            return Color.FromArgb(R, G, B);
        }

 

    为了使用更加方便,我把方法封装成了一个类库,提供了以下几个静态方法:

public static Color MakeDarkColor(int borderline = 180); //获取暗色 默认小于180
public static Color MakeLightColor(int borderline = 180); //获取亮色 默认大于180
public static Color MakeAllColor(); //获取所有颜色
public static Color MakeColorByDefine(int start, int end); //根据范围获取颜色
public static int GetY(Color color); //获取颜色Y值

 

  使用时只需要引用命名空间即可使用MarkRandomColor类的以上静态方法

using ChengChenXu.com.MakeRandomColor;

 

  使用示例:

Color color = MakeRandomColor.MarkLightColor();
Color color = MakeRandomColor.MarkDarkColor(150);
Color color = MakeRandomColor.MarkAllColor();

 

  最后,文件下载:

类库:.NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度ChengChenXu.com.MakeRandomColor.rar

源码与示例:.NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度demo.rar

本文为博主原创,转载请保留出处:
http://www.chengchenxu.com/Article/Show/16/yuv