Convertire System.Drawing.Color per RGB e Hex Valore
-
25-09-2019 - |
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.
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"));
}
Per il codice esadecimale provare questo
- Get ARGB (Alpha, Rosso, Verde, Blu) rappresentanza per il colore
- Filtra Canale alfa:
& 0x00FFFFFF
- Formato il valore (come esadecimale "X6" per hex)
Per RGB uno
- Basta formattare out
Red
,Green
, valoriBlue
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);
}