繁体   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