C#将delphi TColor转换为颜色(十六进制)

C#将delphi TColor转换为颜色(十六进制),c#,delphi,colors,hex,C#,Delphi,Colors,Hex,这些数字存储在数据库中。它们源于Delphi代码。虽然我认为他们遵循某种标准。我试过Color.FromArgb(255) 但我知道第一个是红色的(在delphi端),在ASP.NET中它认为它是蓝色的颜色[a=0,R=0,G=0,B=255] 我想把这些数字写成十六进制。即#000000、#FFFF99等 任何人都知道如何将这些整数(见DB图片)转换为十六进制。Delphi颜色(TColor)不是来自调色板或特殊颜色时是XXBBGGRR 有关格式(和其他特殊情况)的更多详细信息,请参见。此外,

这些数字存储在数据库中。它们源于Delphi代码。虽然我认为他们遵循某种标准。我试过
Color.FromArgb(255)

但我知道第一个是红色的(在delphi端),在ASP.NET中它认为它是蓝色的
颜色[a=0,R=0,G=0,B=255]

我想把这些数字写成十六进制。即#000000、#FFFF99等

任何人都知道如何将这些整数(见DB图片)转换为十六进制。

Delphi颜色(
TColor
)不是来自调色板或特殊颜色时是
XXBBGGRR

有关格式(和其他特殊情况)的更多详细信息,请参见。此外,还包含一些关于特殊情况的详细信息

标准颜色 要转换为标准颜色,您应该使用以下内容:

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);
}
系统颜色 对于系统颜色(数据库中的负值),它们只是被
0x8000000
屏蔽的windows常量

谢谢你提供的信息

示例代码
看起来数字是以10为基数表示的

Delphi本身似乎提供了一些帮助函数(例如,
GetRValue
)来提取相应的读取值、绿色值和蓝色值。你必须自己用c#写一些类似的东西

有了这些值,您可以将它们组合成十六进制字符串

string.Format("#{0:X2}{1:X2}{2:X2}", redComponent, greenComponent, blueComponent);
简单地将整数值转换为十六进制字符串(填充或不填充),很可能做不到正确的事情

正如评论员James L.所指出的,delphi中组件的顺序实际上是不同的。要生成类似于
t颜色的值,顺序必须为:

string.Format("#{0:X2}{1:X2}{2:X2}", blueComponent, greenComponent, redComponent);

将系统颜色转换为RGB的最佳方法是像VCL那样进行。呼叫传递
c&0x000000FF
。换句话说,这些不是VCL定义的,它们是系统定义的。@David,在您的评论中,您提供了准确的答案,您不将其作为答案发布吗?@PA。评论只是答案的一小部分。我希望VirtualBlackFox能将这个建议加入到这个答案中,从而能够删除这个冗长而乏味的列表。@DavidHeffernan我不知道这仅仅是windows常量转换为TColor,非常感谢,我会将它添加到我的答案中。绝对令人惊讶。红灯亮了。和其他人一样。这个答案是我见过的最好的答案之一。布局良好,易于阅读,易于理解。我自己也不知道,所以非常感谢:)我想你的订单是反向的。红色应为#0000FF,绿色应为#00FF00,蓝色应为#FF0000。所以你的颜色顺序应该改为蓝绿红。
string.Format("#{0:X2}{1:X2}{2:X2}", blueComponent, greenComponent, redComponent);