Konvertieren Sie System.Drawing.Color in RGB und Hex-Wert


125

Mit C # habe ich versucht, die folgenden beiden zu entwickeln. Die Art und Weise, wie ich es mache, kann ein Problem haben und braucht Ihren freundlichen Rat. Außerdem weiß ich nicht, ob es eine Methode gibt, um dasselbe zu tun.

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

Vielen Dank.


Antworten:


202

Ich sehe das Problem hier nicht. Der Code sieht für mich gut aus.

Das einzige , was ich denken kann, ist , dass die try / catch - Blöcke sind redundant - Farbe ist eine Struktur und R, G und B sind Bytes, so c nicht Null und sein kann c.R.ToString(), c.G.ToString()und c.B.ToString()scheitern nicht wirklich kann (die Ich kann nur sehen, dass sie versagen, mit a NullReferenceException, und keiner von ihnen kann tatsächlich null sein.

Sie können das Ganze folgendermaßen aufräumen:

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

1
Ich würde sogar sagen, dass leere Try-Catch-Blöcke (fast) universell beseitigt werden sollten. Sie haben ein großes Potenzial, zu fehlerhaftem Code zu führen, wenn nicht jetzt, dann später, wenn dieser Code geändert wird. Trotzdem +1 für den bereinigten Code und +1 für eine gut umrahmte Frage.
JMD

7
Ich habe eine Weile gebraucht, um die VB-Entsprechung zu finden: String.Format ("# {0: X2} {1: X2} {2: X2}", cR, cG, cB)
zacharydl

1
Ich poste eine Anpassung Ihres Codes an C # 6 als alternative Antwort. Sie können es hier sehen .
Aloisdg Umzug auf codidact.com

Dies erzeugt die falsche Farbe, wenn die Farbe einen Alphakanal hat (Transparenz). Sie erhalten volle Undurchsichtigkeit.
LarryBud

@ LarryBud Absolut wahr, und danke, dass Sie darauf hingewiesen haben. In meinem Beispiel wurde der Alphakanal nur übersprungen, weil ich die ursprüngliche Frage, die sie auch nicht enthielt, nicht eingegeben hatte. :)
Ari Roth

189

Sie können es einfach halten und den nativen Farbübersetzer verwenden:

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

Brechen Sie dann die drei Farbpaare in eine ganzzahlige Form:

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

7
Aber wenn ich das so mache, ist Farbe rot = System.Drawing.Color.Red; Zeichenfolge redHex = ColorTranslator.ToHtml (rot); Der Hex-Wert wird nicht angegeben.
Nazmul

Natürlich sollte ich das tun, ich habe diesen Code speziell getestet und # "FF0000" bekommen. Was bekommst du? Sie können sich auch auf die MSDN-Referenz beziehen: msdn.microsoft.com/en-us/library/…
Troy Hunt

Versuchen Sie es mit Farbe rot = System.Drawing.Color.Red; -> # FF0000 wird nicht bereitgestellt.
Nazmul

9
Der von Ihnen bereitgestellte Code funktioniert, aber wenn ich die erste Zeile Ihres Codes in Folgendes ändere: Farbe rot = System.Drawing.Color.Red; -> Dann gibt es keinen Hex-Code. Es gibt "Rot" als Ausgabe.
Nazmul

4
@Hoque - Bestätigt. ColorTranslator gibt der Farbe einen "freundlichen" Namen. Wie nervig!
Anon

38

Wenn Sie C # 6 oder höher verwenden können, können Sie von Interpolated Strings profitieren und die Lösung von @Ari Roth folgendermaßen umschreiben :

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

Ebenfalls:

  • Ich füge das Schlüsselwort hinzu this, um sie als Erweiterungsmethoden zu verwenden.
  • Wir können das Schlüsselwort type stringanstelle des Klassennamens verwenden.
  • Wir können die Lambda-Syntax verwenden.
  • Ich benenne sie um, um sie für meinen Geschmack deutlicher zu machen.

So sauber ... +1!
Shockwaver

26

z.B

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

Dies kann den KnownColor-Trick vermeiden.


1

Ich habe eine Erweiterungsmethode gefunden, die recht gut funktioniert

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

Ref: 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


Ich glaube, es sollte Hex2 sein, nicht Hex, sonst könnte die Farbe falsch interpoliert werden.
Mohammed Noureldin

@MohammedNoureldin Wohin würde Hex2 im Code gehen, ich habe gesehen, dass Farben manchmal etwas anders sind?
Benutzer1

Ich meinte X2stattdessen X, sonst könnten Sie 1stattdessen bekommen, 01dann wird es ein Problem sein.
Mohammed Noureldin

@MohammedNoureldin Ja, X2dann brauchst du nicht alle color.B.ToString("X").Length == 1 ? Ternaries.
ProfK

1

Versuchen Sie dies für hexadezimalen Code

  1. Holen Sie sich die ARGB-Darstellung (Alpha, Rot, Grün, Blau) für die Farbe
  2. Alpha-Kanal herausfiltern :& 0x00FFFFFF
  3. Formatieren Sie den Wert (als hexadezimales "X6" für hex)

Für RGB eins

  1. Nur formatiert aus Red , Green, BlueWerte

Implementierung

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);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.