1. 程式人生 > >十進位制數轉顏色碼(轉RGB轉Color)

十進位制數轉顏色碼(轉RGB轉Color)

今天碰到一個這樣的問題。我在修改以前用VB寫的一個功能,這個功能中有一個部分是使用著色器給一段文字上色。然後這個顏色值存入資料庫中的值是一個十進位制數。新專案用C#,在Winform中需要讀取這個資料給文字畫上顏色。

通過上網找資料以及結合個人理解,該轉換過程主要有以下幾個步驟:

1、十進位制數轉成十六進位制字串。

2、十六進位制字串轉成RGB碼。

3、RGB碼轉成Color型別的值,給控制元件文字顏色屬性賦值。

在研究這個功能實現的過程中需要先了解一些關鍵點。

首先,就是colorEdit等選顏色的控制元件都是通過設定RGB值來設定顏色的。而且R、G、B的範圍都是0~255。轉成十六進位制就是0~FF。因此十六進位制字串為6位字元的字串,範圍為000000~FFFFFF。

其次,就是十進位制轉成十六進位制字串時,字串的字元個數可能沒有6位,這種情況需要在字串前補0。如果超過6位,說明這個十進位制不是用來轉顏色碼的。

最後,通過測試發現這個6位字元的十六進位制字串,前兩個字元對應這RGB碼的B位,中間兩位對應G位,後面兩位對應R位。

一、十進位制轉十六進位制

/// <summary>
        /// 十進位制轉換到十六進位制
        /// </summary>
        /// <param name="strDecimal">十進位制數的字串</param>
        /// <returns>十六進位制字串</returns>
        public static string Decimal2Hexadecimal(string strDecimal)
        {
            //十進位制數
            ulong Decimal = Convert.ToUInt64(strDecimal);
            //十六的倍數
            ulong HexadecimalMultiple;
            //十六進位制數取餘16
            ulong HexadecimalChar;
            //十六進位制字串
            string Hexadecimal = "";
            do
            {
                HexadecimalMultiple = (ulong)Math.Floor((decimal)(Decimal / 16));
                HexadecimalChar = Decimal % 16;
                Hexadecimal = Number2Char(HexadecimalChar) + Hexadecimal;
                Decimal = HexadecimalMultiple;
            }
            while (Decimal >= 16);
            if (Decimal != 0)
                Hexadecimal = Number2Char(Decimal) + Hexadecimal;
            return Hexadecimal;
        }
        /// <summary>
        /// 數字轉字串
        /// </summary>
        /// <param name="number">數字</param>
        /// <returns>字串</returns>
        public static string Number2Char(ulong number)
        {
            switch (number)
            {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                    return number.ToString();
                case 10:
                    return "A";
                case 11:
                    return "B";
                case 12:
                    return "C";
                case 13:
                    return "D";
                case 14:
                    return "E";
                case 15:
                    return "F";
                default:
                    return "";
            }
        }

二、十六進位制轉RGB編碼以及轉Color

        /// <summary>
        /// 十六進位制轉Color
        /// </summary>
        /// <param name="strHexadecimal">十六進位制字串</param>
        /// <returns>顏色值</returns>
        public static Color Hexadecimal2Color(string strHexadecimal)
        {
            try
            {
                if (strHexadecimal.Length == 0)
                {
                    return System.Drawing.Color.FromArgb(0, 0, 0);//設為黑色
                }
                else
                {
                    //十六進位制顏色碼為6個字元,補全6位字元
                    if (strHexadecimal.Length < 6)
                    {
                        strHexadecimal = strHexadecimal.PadLeft(6, '0');
                    }
                    string strB = strHexadecimal.Substring(0, 2);
                    string strG = strHexadecimal.Substring(2, 2);
                    string strR = strHexadecimal.Substring(4, 2);
                    int B = int.Parse(strB, System.Globalization.NumberStyles.AllowHexSpecifier);
                    int G = int.Parse(strG, System.Globalization.NumberStyles.AllowHexSpecifier);
                    int R = int.Parse(strR, System.Globalization.NumberStyles.AllowHexSpecifier);
                    //RGB轉Color
                    Color color = Color.FromArgb(R, G, B);
                    return color;
                }
            }
            catch
            {
                //設為黑色
                return System.Drawing.Color.FromArgb(0, 0, 0);
            }
        }

三、封裝了前面幾個方法後面,就可以封裝一個十進位制轉Color的方法了

        /// <summary>
        /// 十進位制轉Color
        /// </summary>
        /// <param name="Decimal">十進位制數</param>
        /// <returns>顏色值</returns>
        public static Color Decimal2Color(string Decimal)
        {
           return Hexadecimal2Color(Decimal2Hexadecimal(Decimal));
        }

以上是沒有考慮微軟已經封裝好的方法,自己去思考的步驟寫出來的。接下來使用微軟封裝好的一些方法能夠使程式碼更優。

private static Color Decimal2Color(ulong Decimal)
        {
            string Hexadecimal = Decimal.ToString("X6");
            string strB = Hexadecimal.Substring(0, 2);
            string strG = Hexadecimal.Substring(2, 2);
            string strR = Hexadecimal.Substring(4, 2);
            int B = Convert.ToInt32(strB, 16);
            int G = Convert.ToInt32(strG, 16);
            int R = Convert.ToInt32(strR, 16);
            return Color.FromArgb(R, G, B);
        }

ulong型別的十進位制數字.ToString("X6");會轉成十六進位制的6位字串,並且不足6位時會在原來基礎的前面補0。

接下來就是拆分出R、G、B分別對應的字元。

接著,通過Convert.ToInt32("",16),能夠把16進位制字元轉成R、G、B的32位整形數值。

最後使用Color物件的FromArgb()方法,對應放入R、G、B引數值就可以得出顏色。