这些数字存储在数据库中。它们起源于Delphi代码。虽然我认为他们遵循某种标准。我试过了Color.FromArgb(255);
但我知道第一个是RED(在delphi方面),在ASP.NET中,它认为它是蓝色Color [A=0, R=0, G=0, B=255]
无论如何,我希望这些数字成为Hexidecimal。即#000000,#FFFF99等等
任何人都知道如何将这些整数(参见DB图片)转换为十六进制。
答案 0 :(得分:20)
当不是调色板或特殊颜色时,Delphi颜色(TColor
)为XXBBGGRR
。
有关格式(以及其他特殊情况)的更多详细信息,请参阅this article。 The article指出的Christian.K也包含有关特殊情况的一些细节。
要转换为标准颜色,您应该使用以下内容:
var color = Color.FromArgb(0xFF, c & 0xFF, (c >> 8) & 0xFF, (c >> 16) & 0xFF);
要转换为十六进制,:
string ColorToHex(Color color)
{
return string.Format("#{0:X2}{1:X2}{2:X2}",
color.R, color.G, color.B);
}
对于系统颜色(数据库中的负值),它们只是0x80000000
掩盖的窗口常量。
感谢David Heffernan获取信息。
Color DelphiColorToColor(uint delphiColor)
{
switch((delphiColor >> 24) & 0xFF)
{
case 0x01: // Indexed
case 0xFF: // Error
return Color.Transparent;
case 0x80: // System
return Color.FromKnownColor((KnownColor)(delphiColor & 0xFFFFFF));
default:
var r = (int)(delphiColor & 0xFF);
var g = (int)((delphiColor >> 8) & 0xFF);
var b = (int)((delphiColor >> 16) & 0xFF);
return Color.FromArgb(r, g, b);
}
}
void Main()
{
unchecked
{
Console.WriteLine(DelphiColorToColor((uint)(-2147483646)));
Console.WriteLine(DelphiColorToColor(
(uint)KnownColor.ActiveCaption | 0x80000000
));
Console.WriteLine(DelphiColorToColor(0x00FF8000));
}
}
答案 1 :(得分:3)
看起来数字是Delphi TColor values的基数10表示。
Delphi本身似乎提供了一些辅助函数(例如GetRValue
)来提取相应的读取,绿色和蓝色值。你必须在c#中写一些类似的东西。
拥有可以将它们组合成十六进制字符串的值。
string.Format("#{0:X2}{1:X2}{2:X2}", redComponent, greenComponent, blueComponent);
简单地将整数值转换为十六进制字符串(无论是否填充),很可能不会做正确的事情。
UPDATE 作为评论者詹姆斯L.指出,组件的顺序实际上是/在delphi中不同。要生成类似TColor
的值,订单必须为:
string.Format("#{0:X2}{1:X2}{2:X2}", blueComponent, greenComponent, redComponent);