【问题标题】:C# Converting delphi TColor to color (Hex)C# 将 delphi TColor 转换为颜色(十六进制)
【发布时间】:2012-01-09 00:33:55
【问题描述】:

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

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

无论如何我都希望将这些数字转换为十六进制。 IE。 #000000 , #FFFF99 等等

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

【问题讨论】:

    标签: c# delphi colors hex


    【解决方案1】:

    看起来这些数字是 Delphi TColor values 的 base-10 表示。

    Delphi 本身似乎提供了一些辅助函数(例如GetRValue)来提取各自的读取、绿色和蓝色值。您必须自己在 c# 中编写类似的东西。

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

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

    简单地将整数值转换为十六进制字符串,无论是否填充,很可能不会做正确的事情。

    UPDATE 正如评论者 James L. 指出的那样,组件的顺序实际上对于/在 delphi 中是不同的。要生成类似TColor 的值,顺序必须是:

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

    【讨论】:

    • 我认为您的订单是倒序的。红色应该是#0000FF,绿色应该是#00FF00,蓝色应该是#FF0000。所以你的颜色顺序应该改为蓝绿红。
    【解决方案2】:

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

    有关格式的更多详细信息(以及其他特殊情况),请参阅this articleChristian.K 所指的The article 还包含一些特殊情况的详细信息。

    标准颜色

    要转换为标准颜色,您应该使用类似:

    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));
        }
    }
    

    【讨论】:

    • 将系统颜色转换为 RGB 的最佳方法是像 VCL 那样做。致电GetSysColor() 传递c & 0x000000FF。换句话说,这些不是 VCL 定义的,它们是 system 定义的。
    • @David,在您的评论中,您提供了确切的答案,您不将其发布为答案吗?
    • @PA。评论只是答案的一小部分。我希望 VirtualBlackFox 会将建议纳入此答案,以便能够删除相当长且令人厌烦的列表。
    • @DavidHeffernan 我没有意识到这只是将 windows 常量转换为 TColor,非常感谢,我会将其添加到我的答案中。
    • 太棒了。红色现在正在工作。与所有其他人一起。这个答案是我见过的最好的答案之一。布局非常好,易于阅读,易于理解。我自己也想不通,所以非常感谢:)
    猜你喜欢
    • 2017-10-30
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2014-10-02
    • 2013-08-08
    相关资源
    最近更新 更多