我尝试使用 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;
}
谢谢。
我没有看到这里的问题。该代码对我来说看起来不错。
我唯一能想到的是try/catch块是多余的——Color是一个结构体,而
R
、G
和B
是字节,所以c
不能是null
并且 c.R.ToString()
、c.G.ToString()
和 c.B.ToString()
实际上不会失败(我看到它们失败的唯一方法是使用 NullReferenceException
,而且它们中没有一个实际上可以是 null
)。
您可以使用以下方法清理整个东西:
private static String ToHex(System.Drawing.Color c)
=> $"#{c.R:X2}{c.G:X2}{c.B:X2}"
private static String ToRGB(System.Drawing.Color c)
=> $"RGB({c.R},{c.G},{c.B})"
您可以保持简单并使用本机颜色转换器:
Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);
然后将三个颜色对分解为整数形式:
int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
如果您可以使用 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
将它们用作扩展方法。string
来代替类名。编辑:如果你想支持 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}";
private 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})";
}
有趣的事实:我必须搜索 proportion 名称,因为我们想要区间
[0, 1]
中的值,而不是区间 [0, 100]
中的百分比
例如
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"));
}
对于十六进制代码试试这个
& 0x00FFFFFF
RGB 的
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);
}