为什么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来改变字符串,是否有一种方法可以以我用来设置控件的背景色的相同格式检索值?我不喜欢删除/替换,因为它可以使用十六进制或实际的颜色名称。
谢谢。
第一个字节(在您的例子中是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 */
}