asp.net 将系统.绘图.颜色转换为RGB和十六进制值

holgip5t  于 2022-12-15  发布在  .NET
关注(0)|答案(6)|浏览(155)

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

谢谢。

ovfsdjhp

ovfsdjhp1#

我看不出有什么问题。代码看起来不错。
我唯一能想到的是try/catch代码块是冗余的-- Color是一个结构体,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() + ")";
}
nwlqm0z1

nwlqm0z12#

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

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

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

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

2ekbmq323#

如果你能使用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代替类名。
  • 我们可以使用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}";

    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]的百分比

o3imoua4

o3imoua44#

例如:

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

这样可以避免“已知颜色”技巧。

sqxo8psd

sqxo8psd5#

我发现了一个扩展方法,效果很好

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

plupiseo

plupiseo6#

对于十六进制代码,请尝试以下操作
1.* 获取颜色的 * ARGB(Alpha、红色、绿色、蓝色)表示
1.* 滤出 * Alpha通道:& 0x00FFFFFF
1.格式化输出值(十六进制“X6”表示十六进制)
对于RGB 1
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);
}

相关问题