为什么System.Drawing.Color会添加'ff'十六进制代码

本文关键字:十六进制 代码 ff 添加 System Drawing Color 为什么 | 更新日期: 2023-09-27 17:53:21

我有一个从数据库检索的颜色#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来改变字符串,是否有一种方法可以以我用来设置控件的背景色的相同格式检索值?我不喜欢删除/替换,因为它可以使用十六进制或实际的颜色名称。

谢谢。

为什么System.Drawing.Color会添加'ff'十六进制代码

第一个字节(在您的例子中是FF)表示颜色透明度。其他三个字节描述颜色,具体取决于编码,例如可以是RGB。

所以代码FF FFFFFF,显示FFFFFF颜色的透明度

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

这是颜色的alpha分量,即透明度。如果您需要一个一致的格式,您可以从R、G和B组件中创建它,并将其转换为十六进制。

所以,不必通过删除/替换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"

这是颜色的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-channel总是存储在高字节中(这是用十六进制表示法写入时最先出现的双元组)。

订单是#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  */
}