143

使用 C# 我试图开发以下两个。我这样做的方式可能有一些问题,需要你的建议。另外,我不知道是否有任何现有的方法可以做到这一点。

private static String HexConverter(System.Drawing.Color c)
{
    String rtn = String.Empty;
    try
    {
        rtn = "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
    }
    catch (Exception ex)
    {
        //doing nothing
    }

    return rtn;
}

private static String RGBConverter(System.Drawing.Color c)
{
    String rtn = String.Empty;
    try
    {
        rtn = "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
    }
    catch (Exception ex)
    {
        //doing nothing
    }

    return rtn;
}

谢谢。

4

6 回答 6

238

我没有看到这里的问题。代码对我来说看起来不错。

我唯一能想到的是 try/catch 块是多余的—— Color 是一个结构,R、G 和 B 是字节,所以 c 不能为 null 和c.R.ToString(),c.G.ToString()并且c.B.ToString()实际上不能失败(我可以看到它们失败的唯一方法是使用 a NullReferenceException,并且它们实际上都不能为空)。

您可以使用以下内容清理整个事情:

private static String HexConverter(System.Drawing.Color c)
{
    return "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
}

private static String RGBConverter(System.Drawing.Color c)
{
    return "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
}
于 2010-03-07T09:01:58.303 回答
202

您可以保持简单并使用本机颜色转换器:

Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);

然后将三个颜色对分解为整数形式:

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
于 2010-03-07T07:13:54.693 回答
46

如果您可以使用 C#6 或更高版本,则可以从Interpolated Strings中受益并像这样重写@Ari Roth 的解决方案

C# 6:

public static class ColorConverterExtensions
{
    public static string ToHexString(this Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}";

    public static string ToRgbString(this Color c) => $"RGB({c.R}, {c.G}, {c.B})";
}

还:

  • 我添加关键字this以将它们用作扩展方法。
  • 我们可以使用 type 关键字string代替类名。
  • 我们可以使用 lambda 语法。
  • 我将它们重命名为更符合我的口味。
于 2016-06-14T19:58:08.143 回答
29

例如

 ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))

这可以避免 KnownColor 技巧。

于 2015-02-28T03:38:42.633 回答
3

我发现了一种效果很好的扩展方法

public static string ToHex(this Color color)
{
    return String.Format("#{0}{1}{2}{3}"
        , color.A.ToString("X").Length == 1 ? String.Format("0{0}", color.A.ToString("X")) : color.A.ToString("X")
        , color.R.ToString("X").Length == 1 ? String.Format("0{0}", color.R.ToString("X")) : color.R.ToString("X")
        , color.G.ToString("X").Length == 1 ? String.Format("0{0}", color.G.ToString("X")) : color.G.ToString("X")
        , color.B.ToString("X").Length == 1 ? String.Format("0{0}", color.B.ToString("X")) : color.B.ToString("X"));
}

参考:https://social.msdn.microsoft.com/Forums/en-US/4c77ba6c-6659-4a46-920a-7261dd4a15d0/how-to-convert-rgba-value-into-its-equivalent-hex-code?论坛=winappswithcsharp

于 2016-04-26T13:44:19.447 回答
2

对于十六进制代码试试这个

  1. 获取颜色的 ARGB(Alpha、Red、Green、Blue)表示
  2. 过滤掉Alpha 通道:& 0x00FFFFFF
  3. 格式化值(十六进制“X6”表示十六进制)

对于 RGB 一

  1. 只需格式化 Red, Green,Blue

执行

private static string HexConverter(Color c) {
  return String.Format("#{0:X6}", c.ToArgb() & 0x00FFFFFF);
}

public static string RgbConverter(Color c) {
  return String.Format("RGB({0},{1},{2})", c.R, c.G, c.B);
}
于 2016-07-04T13:25:31.830 回答