将System.Drawing.Color转换为RGB和Hex值

时间:2010-03-07 06:54:12

标签: c# asp.net rgb system.drawing.color

使用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;
}

感谢。

6 个答案:

答案 0 :(得分:175)

我没有在这里看到问题。代码对我来说很好。

我唯一能想到的是try / catch块是冗余的 - Color是一个结构,R,G和B是字节,所以c不能为空c.R.ToString(),{ {1}},而c.G.ToString()实际上不会失败(我看到它们失败的唯一方法是使用c.B.ToString(),并且它们都不能实际为空。)

您可以使用以下方法清理整个内容:

NullReferenceException

答案 1 :(得分:172)

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

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

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

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

答案 2 :(得分:29)

如果你可以使用C#6,你可以从Interpolated Strings中受益,并像这样重写@Ari Roth's solution

C#6:

70

此外:

  • 我添加关键字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代替类名。
  • 您可以使用lambda语法
  • 我将它们重命名为更符合我的口味。

答案 3 :(得分:22)

e.g。

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

这可以避免使用KnownColor技巧。

答案 4 :(得分:1)

我找到了一种效果很好的扩展方法

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

参考:http://dotnetcatch.com/2016/04/27/setparameters-via-msbuild-commandline/

答案 5 :(得分:1)

对于十六进制代码,请尝试使用

  1. 获取颜色的ARGB(Alpha,红色,绿色,蓝色)表示
  2. 过滤掉 Alpha频道:& 0x00FFFFFF
  3. 格式化值(十六进制" X6"十六进制)
  4. 对于RGB one

    1. 只需格式化 RedGreenBlue
    2. 实施

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