.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模式判斷顏色明亮度