.NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于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();

  最后,文件下载:

类库:ChengChenXu.com.MakeRandomColor.rar

源码与示例:demo.rar

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

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

  1. C#生成随机验证码

    使用YZMHelper帮助类即可 using System; using System.Web; using System.Drawing; using System.Security.Cryptog ...

  2. PHP 生成随机字符串与唯一字符串

    说明:生成随机字符串用到的方法有 mt_rand() 生成唯一字符串用到的方法有 md5(),uniqid(),microtime() 代码: <?php /* * 生成随机字符串 * @par ...

  3. php生成随机产生六位数密码的代码

    php生成随机产生六位数密码的代码,供大家学习参考.本文转自:http://www.jbxue.com/article/6199.html php生成随机产生六位数密码的代码,供大家学习参考. 复制代 ...

  4. PHP生成随机字符串与唯一字符串

    代码如下: <?php /* * 生成随机字符串 * @param int $length 生成随机字符串的长度 * @param string $char 组成随机字符串的字符串 * @ret ...

  5. 采用HSV生成随机颜色

    使用hsv/hsb生成随机颜色,并排除靠近黑白两色的色值 public static String randomColor(){ int max = 25500000 ; Random rand = ...

  6. PHP生成随机水印图片

    基于PHP的GD图形库,自己生成一张图片.仅限初识GD库,实例学习. 一.需求 网站的布局用到了类似慕课网课程列表的风格,每一个课程是一个banner图,图下面是标题加简介.因为课程的数量较大没有为所 ...

  7. Color.js增强你对颜色的控制

    往逝之因 不要低头,皇冠会掉...  可你又没有皇冠 Color.js 增强你对颜色的控制 阅读目录 轻松管理颜色--color.js库 使用color.js Accessor Methods 你该知 ...

  8. Python Faker的使用(1):基础使用方法与函数速查,生成随机数据

    在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据. 在手动制造数据的过程中,可能需要花费大量精力和工作量,现在好了,有一 ...

  9. Unity Shader-后处理:简单的颜色调整(亮度,饱和度,对比度)

    好久没坚持写blog了,是时候开始撸一波新博文了!学习Unity有一段时间了,关于Shader的书也看了几本<Unity Shader入门精要>,<Unity 3D ShaderLa ...

随机推荐

  1. [01] radio ,checkbox 表单文字对齐

    http://www.cnblogs.com/wangsir015/p/5555818.html 这几天在做表单时总会碰到复选框(checkbox)和单选框(radio)与文字不对齐的问题,要不是ch ...

  2. iOS 代理为啥要用weak修饰?

    在开发中我们经常使用代理,或自己写个代理,而代理属性都用weak(assign)修饰,看过有些开发者用strong(retain),但并没发现有何不妥,也不清楚weak(assign)与strong( ...

  3. Nim积

    假如把Nim游戏的取胜规则改为谁取走最后一个石子谁输的话 先手必胜当且仅当: 1.所有堆的石子数都为1且游戏的SG值为0 2.有些堆的石子数大于1且游戏的SG值不为0

  4. 在razor中使用递归,巧用递归

    原文发布时间为:2011-04-20 -- 来源于本人的百度文章 [由搬家工具导入] Learning Razor–Writing an Inline Recursive HTML Helper Wr ...

  5. Day 22 Object_oriented_programming 3

    isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True 1 class F ...

  6. 属性动画详解一(Property Animation)

    效果图: Android动画有3类: 1.View Animation (Tween Animation) 2.Drawable Animation (Frame Animation) 2.Prope ...

  7. LeetCode OJ-- N-Queens **

    https://oj.leetcode.com/problems/n-queens/ n皇后问题,1皇后有1个解,4皇后2个解,8皇后也有解…… 每个皇后不能在同一行上,同一列上,以及同一条45度线上 ...

  8. ngrx/store effects 使用总结2:列表展示

    第一个计数器案例:http://www.cnblogs.com/axel10/p/8589122.html 完成了计数器案例后,现在开始比较能够完整的展示angular2+开发流程的案例:在线获取用户 ...

  9. luogu P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

    题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i & ...

  10. 2016北京集训测试赛(十七)Problem C: 数组

    Solution 线段树好题. 我们考虑用last[i]表示\(i\)这个位置的颜色的上一个出现位置. 考虑以一个位置\(R\)为右端点的区间最远能向左延伸到什么位置: \(L = \max_{i \ ...