Domanda

con C # stavo cercando di sviluppare le seguenti due. Il modo in cui sto facendo potrebbe avere qualche problema e hanno bisogno il vostro consiglio gentile. Inoltre, non so se c'è qualche metodo esistente a fare lo stesso.

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

Grazie.

È stato utile?

Soluzione

sto riuscendo a vedere il problema qui. Il codice sembra buono per me.

L'unica cosa che posso pensare è che i try / blocchi catch sono ridondanti - colore è una struct e R, G, B e sono byte, così c non può essere nullo e c.R.ToString(), c.G.ToString() e c.B.ToString() lattina 't effettivamente omesso (l'unico modo in cui posso vederli in mancanza è con un NullReferenceException, e nessuno di loro in realtà può essere nullo).

Si potrebbe pulire il tutto utilizzando il seguente:

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

Altri suggerimenti

Si potrebbe fare cose semplici e utilizzare il traduttore di colore nativo:

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

Poi rompere le tre coppie di colori in forma integer:

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

Se è possibile utilizzare C # 6, si può beneficiare di interpolata stringhe e riscrivere di @Ari Roth soluzione in questo modo:

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

Inoltre:

  • aggiungo la parola this di usarli come metodi di estensioni.
  • Siamo in grado di utilizzare il tipo di parola chiave string al posto del nome della classe.
  • Si può utilizzare la sintassi lambda.
  • I rinominare loro di essere più esplicito per i miei gusti.

per es.

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

Questo può evitare il trucco KnownColor.

Ho trovato un metodo di estensione che funziona abbastanza bene

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

Rif: https://social.msdn.microsoft.com/Forums/en-US/4c77ba6c-6659-4a46-920a-7261dd4a15d0/how-to- convert-RGBA-value-in-suo-equivalente-hex-code? forum = winappswithcsharp

Per il codice esadecimale provare questo

  1. Get ARGB (Alpha, Rosso, Verde, Blu) rappresentanza per il colore
  2. Filtra Canale alfa: & 0x00FFFFFF
  3. Formato il valore (come esadecimale "X6" per hex)

Per RGB uno

  1. Basta formattare out Red, Green, valori Blue

Attuazione

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top