随机颜色在日常开发中很常用到,有时候要控制颜色敞亮度,好比在白色配景网页上的随机颜色,一般要求颜色稍微暗一些,如果生成太亮的颜色会造成阅读困难,再好比你想判断生成的配景色是暗色还是亮色,以决定前景色是白色还是黑色.
给与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>起始数值 0-255</param> /// <param>结束数值 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
源码与示例: