十進位制數轉顏色碼(轉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引數值就可以得出顏色。