1. 程式人生 > >.NET C#生成隨機顏色,可以控制亮度,生成暗色或者亮色 基於YUV模式判斷顏色明亮度

.NET C#生成隨機顏色,可以控制亮度,生成暗色或者亮色 基於YUV模式判斷顏色明亮度

閱讀 顏色 只需要 syntax 制式 ear highlight 模式 不能

  隨機顏色在日常開發中很常用到,有時候要控制顏色明亮度,比如在白色背景網頁上的隨機顏色,一般要求顏色稍微暗一些,如果生成太亮的顏色會造成閱讀困難,再比如你想判斷生成的背景色是暗色還是亮色,以決定前景色是白色還是黑色.

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