转换系统。绘图。颜色为 RGB 和十六进制值

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

谢谢。

197645 次浏览

你可以保持简单,并使用本色翻译:

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

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

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

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

我唯一能想到的是 try/catch 块是多余的—— Color 是一个 struct,R、 G 和 B 是字节,所以 c 不能为 null,而 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() + ")";
}

例如:。

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

这可以避免 KnownColor 技巧。

我发现了一种非常有效的扩展方法

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?forum=winappswithcsharp

如果您可以使用 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 语法。
  • 我给它们重新命名,以便更加明确地符合我的口味。

编辑: 如果你想支持 alpha 通道:

public static class ColorConverterExtensions
{


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


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


// #RRGGBBAA
public static string ToHexaString(this Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}{c.A:X2}";


public static double ToProportion(byte b) => b / (double)Byte.MaxValue;


// RGBA(R, G, B, A)
public static string ToRgbaString(this Color c) => $"RGBA({c.R}, {c.G}, {c.B}, {ToProportion(c.A):N2})";
}

有趣的事实: 我必须搜索关于 比例的名称,因为我们想要一个在区间 [0, 1]中的值,而不是在区间 [0, 100]中的百分比

对于十六进制代码,请尝试这样做

  1. 获取颜色的 ARGB (Alpha,Red,Green,Blue)表示形式
  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);
}