我有一个颜色#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 来更改字符串,有没有办法以我用于设置控件背景颜色的相同格式检索值?我不喜欢删除/替换,因为它可以使用十六进制或实际颜色名称。
感谢。
答案 0 :(得分:3)
第一个字节(在您的情况下为FF)表示颜色透明度。其他三个字节描述颜色,具体取决于编码,例如RGB。
所以代码 FF FFFFFF,显示FFFFFF颜色透明度。
其中FF表示最密集的颜色,而00表示完全透明。
答案 1 :(得分:0)
这是颜色的alpha分量,即透明度。如果您需要一致的格式,可以从转换为十六进制的R,G和B组件自己创建。
答案 2 :(得分: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"
答案 3 :(得分:0)
这是颜色的alpha通道。它以8位存储,就像红色,绿色和蓝色分量值一样。正如红色,绿色和蓝色范围从0(0x00)到255(0xFF)一样,alpha通道也是如此。
带alpha通道的颜色值实际上是 32位长(4字节×8位/字节),而不是您可能习惯使用的正常24位颜色。
Alpha通道允许透明效果。换句话说,它控制颜色与背景的混合方式。 alpha通道值为0(0x00)表示颜色完全透明 - 基本上没有颜色。 alpha通道值255(0xFF)表示颜色完全不透明。 24位颜色总是完全不透明,因为它们没有alpha通道。
这意味着#224466 与
我理解,但我不能使用#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 */
}