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

Hoq*_*que 115 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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Ari*_*oth 186

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

我能想到的唯一的事情是,try/catch块是多余的-颜色是一个结构和R,G和B是字节,所以C不能为空并且c.R.ToString(),c.G.ToString()c.B.ToString()实际上不能失败(在唯一可以看到它们失败的方法是使用a NullReferenceException,而且它们中没有一个实际上可以为null).

您可以使用以下方法清理整个事情:

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() + ")";
}
Run Code Online (Sandbox Code Playgroud)

  • 花了一些时间找到VB equivelant:String.Format("#{0:X2} {1:X2} {2:X2}",cR,cG,cB) (7认同)
  • 我什至想说空的 try-catch 块应该(几乎)普遍被根除。它们很有可能导致错误代码,如果不是现在,那么当代码被修改时。尽管如此,+1 对于清理后的代码,对于 OP +1 对于一个框架良好的问题。 (2认同)
  • 我将您的代码改编为 C#6 作为替代答案。您可以在[此处](http://stackoverflow.com/a/37821008/1248177)看到它。 (2认同)

Tro*_*unt 178

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

Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);
Run Code Online (Sandbox Code Playgroud)

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

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
Run Code Online (Sandbox Code Playgroud)

  • 但如果我这样做,Color red = System.Drawing.Color.Red; string redHex = ColorTranslator.ToHtml(red); 它不提供十六进制值. (7认同)
  • 您提供的代码可以使用,但是当我将代码的第一行更改为:Color red = System.Drawing.Color.Red; - >然后它不给出十六进制代码.它将"红色"作为输出. (7认同)
  • 要在CSS中使用,"友好"颜色名称仍然有效. (7认同)
  • @Hoque - 确认.ColorTranslator为颜色提供"友好"的名称.多烦啊! (3认同)

alo*_*ica 34

如果您可以使用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})";
}
Run Code Online (Sandbox Code Playgroud)

也:

  • 我添加关键字this以将它们用作扩展方法.
  • 您可以使用type关键字string而不是类名.
  • 您可以使用lambda语法
  • 我将它们重命名为更符合我的口味.


And*_*ong 23

例如

 ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))
Run Code Online (Sandbox Code Playgroud)

这可以避免KnownColor技巧.