将System.Drawing.Color转换为RGB和十六进制值


125

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

谢谢。


Answers:


202

我在这里看不到问题。该代码对我来说看起来不错。

我能想到的唯一的事情是,try / catch块是多余的-颜色是一个结构和R,G和B是字节,所以C不能为空并且c.R.ToString()c.G.ToString()c.B.ToString()实际上不能失败(在我看到它们失败的唯一方法是使用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() + ")";
}

1
我要说的是,应该(几乎)普遍消除空的try-catch块。他们有很大的潜力导致错误的代码,如果现在还不行,那么在修改此代码时便会产生麻烦。不过,对于清理后的代码+1,对于结构合理的问题,对OP +1。
JMD 2014年

7
花了我一段时间找到VB等价物:String.Format(“#{0:X2} {1:X2} {2:X2}”,cR,cG,cB)
zacharydl

1
我将您的代码改编为C#6作为替代答案。你可以在这里看到它。
aloisdg移至codidact.com,2016年

如果颜色具有Alpha通道(透明度),则会产生错误的颜色。您将获得完全的不透明。
拉里·布德(LarryBud)

@LarryBud绝对正确,感谢您指出。我的示例跳过了alpha通道,只是因为我没有输入原始问题,也没有包括它。:)
阿里·罗斯

189

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

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

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

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

7
但是如果我这样做,红色= System.Drawing.Color.Red; 字符串redHex = ColorTranslator.ToHtml(red); 它不提供十六进制值。
Nazmul

当然应该做,我专门测试了该代码并得到了“ FF0000”。你得到什么?您可能还喜欢参考MSDN参考:msdn.microsoft.com/en-us/library/...
特洛伊亨特

尝试使用红色= System.Drawing.Color.Red; ->它不提供#FF0000。
Nazmul

9
您提供的代码有效,但是当我将代码的第一行更改为时:红色= System.Drawing.Color.Red; ->则不给出十六进制代码。它给出“红色”作为输出。
Nazmul

4
@Hoque-确认。ColorTranslator为颜色指定一个“友好”名称。真烦人!
2013年

38

如果您可以使用C#6或更高版本,则可以从插值字符串中受益并重写@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语法。
  • 我将它们重命名为更符合我的口味。

太干净了+1!
Shockwaver

26

例如

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

这样可以避免KnownColor技巧。


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

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


我相信应该是Hex2,而不是Hex,否则颜色插值可能不正确。
Mohammed Noureldin

@MohammedNoureldin Hex2会在代码中到哪里去,我看到有时颜色会略有不同吗?
user1

我的意思是X2而不是X,否则您可能会得到1代替,01这将是一个问题。
Mohammed Noureldin

@MohammedNoureldin是的,X2那么您不需要所有的color.B.ToString("X").Length == 1 ? 三元组。
ProfK

1

对于十六进制代码,请尝试以下操作

  1. 获取颜色的ARGB(Alpha,红色,绿色,蓝色)表示形式
  2. 过滤掉 Alpha通道:& 0x00FFFFFF
  3. 格式化值(十六进制为“ X6”)

对于RGB一

  1. 格式化了 RedGreenBlue

实作

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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.