這兩天看以前一個系統的資料庫時,發現其中有個Color欄位,顯然是儲存顏色的。但欄位類型卻是Integer,儲存的值是一長串數字。一時犯糊,跑去問經理數字怎麼換算成R、G、B三個值啊?經理說你難道不知道RGB函數嗎?哦,想起來了。用VB開發的朋友應該都知道這個函數,確切的說是一個宏,在MSDN6中找到它的定義:
#define RGB(r, g ,b) ((DWORD) (((BYTE) (r) | \ ((WORD) (g) << 8)) | \ (((DWORD) (BYTE) (b)) << 16)))
也許您跟我一樣電腦基礎學的不好,看到這堆東東有點暈。那麼看下面這個它效果相同的公式就明白了:
RGB = R + G * 256 + B * 256 * 256
C#中沒有RGB函數,不過知道了原理,馬上能寫一個出來。
辦法一,笨辦法,效率也低,但是好理解,呵呵。
int rgb = 202 + 69 * 256 + 137 * 256 * 256;
int b = rgb / (256 * 256);
int g = (rgb - b * 256 * 256) / 256;
int r = (rgb - b * 256 * 256 - g * 256);
辦法二:網上找來的,用移位做,號稱是最高效的辦法。不過按MSDN上說的,uint、ushort等類型不符合CLS,不知道會有什麼問題。
uint ParseRGB(Color color)
{
return (uint)(((uint)color.B << 16) | (ushort)(((ushort)color.G << 8) | color.R));
}
Color RGB(int color)
{
int r = 0xFF & color;
int g = 0xFF00 & color;
g >>= 8;
int b = 0xFF0000 & color;
b >>= 16;
return Color.FromArgb(r, g, b);
}