簡體   English   中英

為什么System.Drawing.Color將'ff'添加到十六進制代碼?

[英]Why does System.Drawing.Color add 'ff' to hex code?

我有一個顏色#cccc00 ,我從數據庫中檢索,並用於繪制控件的背景。

由於我不知道字符串是十六進制還是顏色的名稱(即黃色#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來更改字符串,有沒有辦法以我用於設置控件的背景顏色的相同格式檢索值? 我不喜歡刪除/替換,因為它可以使用十六進制或實際顏色名稱。

謝謝。

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

所以代碼FF FFFFFF顯示了FFFFFF顏色的透明度

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

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

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

好吧,你使用ColorTranslator.FromHtm方法從字符串中獲取顏色值。 相反,您可以使用ColorTranslator.ToHtml

只要確保使用不區分大小寫的搜索,因為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"

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

帶有alpha通道的顏色值實際上是32位長(4字節×8位/字節),而不是您可能習慣使用的正常24位顏色。

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

這意味着#224466是完全相同的顏色為#FF224466相同。

我理解,但我不能使用#cccc00ff作為顏色,因為它與#cccc00完全不同。

是的,那些是不同的顏色,因為你混淆了字節位置。 alpha通道始終存儲在高字節中(這是以十六進制表示法寫出時的雙峰)。

訂單是#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  */
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM