2016-06-29 66 views
1

我有一個顏色#cccc00,我從數據庫中檢索,並用於繪製控件的背景。爲什麼System.Drawing.Color將'ff'添加到十六進制代碼?

因爲我不知道該字符串將是十六進制或顏色的名稱(即黃色#cccc00),我檢查字符串,像這樣:

string color = "#cccc00"; 
if (color.IndexOf('#') >= 0) 
{ 
    Color _color = System.Drawing.ColorTranslator.FromHtml(color); 
    buttonSelector.BackColor = _color; 
    // _color.Name now equals ffcccc00 
} 

這工作正常。問題是我也使用該字符串(顏色)來搜索一個SQL表。問題是_color.Name返回ffcccc00,所以搜索將不會返回任何內容,因爲sql表具有它作爲#cccc00

因此,無需通過刪除/替換ff來更改字符串,是否有辦法以我用於設置控件背景色的相同格式檢索值?我不喜歡刪除/替換,因爲它可以使用十六進制或實際的顏色名稱。

謝謝。

+0

是不是透明度?像rgba(r,g,b,a)? –

+0

我不確定你的意思。 – rbhat

+0

我的意思是alpha通道的顏色,它不是4部分 –

回答

3

第一個字節(在你的情況下,FF)表示顏色透明度。其他三個字節描述顏色,取決於編碼,例如可以是RGB。

So代碼FF FFFFFF,顯示FFFFFF顏色的透明度

其中FF表示最密集的顏色,而00表示完全透明。

+1

只是爲了完成答案:FF意味着不透明的地方,00表示完全透明。 –

+0

另外,如果你需要你自己的轉換函數來HTML代碼而沒有透明度,請看這裏.http://stackoverflow.com/a/14710792/6439999 –

0

這是顏色的alpha分量,即透明度。如果您需要一致的格式,您可以從您轉換爲十六進制的R,G和B組件中自行創建。

0

因此,不必通過刪除/替換ff來更改字符串,有沒有辦法以我用於設置控件背色的相同格式檢索值?

那麼,你用ColorTranslator.FromHtm方法從字符串中獲取顏色值。做相反的事情,你可以使用ColorTranslator.ToHtml

只要確保您使用不區分大小寫的搜索,因爲ToHtml方法會使用大寫十六進制值。

例如:

string colorA = "#cccc00"; 
Color color = ColorTranslator.FromHtml(colorA); 
string colorB = ColorTranslator.ToHtml(color); // "#CCCC00" 

string colorA = "AliceBlue"; 
Color color = ColorTranslator.FromHtml(colorA); 
string colorB = ColorTranslator.ToHtml(color); // "AliceBlue" 
0

這是顏色的alpha通道。它以8位存儲,就像紅色,綠色和藍色分量值一樣。正如紅色,綠色和藍色範圍從0(0x00)到255(0xFF)一樣,alpha通道也是如此。

帶有alpha通道顏色值實際上32位長(4個字節× 8比特/字節),而不是認爲你可能從網絡用於將正常的24位的顏色。

Alpha通道允許透明效果。換句話說,它控制着顏色與背景的融合方式。 0(0x00)的alpha通道值表示顏色完全透明 - 基本上沒有顏色。 alpha通道值爲255(0xFF)表示顏色完全不透明。 24位顏色總是完全不透明,因爲它們沒有alpha通道。

這意味着#224466是,精確地爲,顏色和#FF224466的顏色一致。

據我所知,但我不能使用#cccc00ff作爲顏色,因爲它與#cccc00是完全不同的顏色。

是的,這些是不同的顏色,因爲你混合了字節位置。 alpha通道始終存儲在高字節中(這是在以十六進制表示法寫出時第一個出現的doublet)。

訂單是#AARRGGBB。 alpha通道值存儲在高字節中,紅色接下來,然後是綠色,最後是低字節中的藍色。這個訂單沒有什麼神聖之處,但它已成爲事實上的標準。 (您還偶爾會找到#AABBGGRR。)

如果您不需要alpha通道信息並且只需要使用24位顏色,則可以修剪掉包含alpha通道值的高位字節。或者您可以將其存儲在數據庫中。沒關係,因爲它們代表相同的顏色。

您可以自己分析的價值,忽略Alpha通道的值(一個或多個),如果必要的話:

String RgbColorToHexString(Color clr) 
{ 
    return string.Format("#{0:X2}{1:X2}{2:X2}", 
         clr.R, 
         clr.G, 
         clr.B); 
} 

Color HexStringToRgbColor(String str) 
{ 
    int argb = Int32.Parse(str.Replace("#", ""), NumberStyles.HexNumber); 
    return Color.FromArgb((argb & 0x00FF0000) >> 16, /* red component */ 
          (argb & 0x0000FF00) >> 8, /* green component */ 
          (argb & 0x000000FF));  /* blue component */ 
} 
相關問題