[C#] Convertirea string în Color și invers

Aceste metode statice sunt folositoare, de exemplu, într-un program în care utilizatorul poate selecta o culoare care trebuie salvată ca o setare, de exemplu într-un fișier XML, și încărcată din acel fișier XML la următoarea pornire a programului. Metoda Color.ToString nu este suficientă uneori (de exemplu, în cazul în care șirul de caractere trebuie într-un alt format).

Metodele sunt puse într-o clasă statică Utils, care nu e pusă în întregime aici. Sunt marcate ca internal pentru a putea fi folosite din interiorul proiectului în care se află dar nu din afară.

Cod sursă

internal static string ColorToString(Color color)
{
    byte a = color.A,
        r = color.R,
        g = color.G,
        b = color.B;
    byte[] arr = new byte[] { a, r, g, b };
    string s = BitConverter.ToString(arr).Replace("-", "");
    return "#" + s;
}

internal static Color StringToColor(string str)
{
    int a = Int32.Parse(str.Substring(1, 2), System.Globalization.NumberStyles.HexNumber);
    int r = Int32.Parse(str.Substring(3, 2), System.Globalization.NumberStyles.HexNumber);
    int g = Int32.Parse(str.Substring(5, 2), System.Globalization.NumberStyles.HexNumber);
    int b = Int32.Parse(str.Substring(7, 2), System.Globalization.NumberStyles.HexNumber);

    return Color.FromArgb(a, r, g, b);
}

Capturi de ecran

Explicație

Color este un tip structură din domeniul (en. namespace) System.Drawing. Are proprietăție A (opacitatea, alfa), R (red, roșu), G (green, verde), B (blue, albastru). Aceste 4 proprietăți au tipul byte și stochează valori de la 0 la 255. Cu cât valoarea e mai mare, cu atât culoarea respectivă e mai intensă în culoarea afișată de structura Color respectivă, sau în cazul A culoarea devine mai puțin transparentă cu cât valoarea e mai mare, 255 însemnând opac complet.

Funcția ColorToString transformă culoarea color într-un string. Ea folosește metoda statică BitConverter.ToString pentru a transforma tabloul unidimensional de lungime 4, tip byte cu cele 4 proprietăți in ordinea de mai sus, pentru a obține un șir de caractere cu cele 4 proprietăți în baza 16. Apoi imediat se apelează Replace pentru a șterge caracterele „-” din șirul obținut. De exemplu, înainte de Replace valoarea este "F4-19-28-F1" și se șterg caracterele „-” apoi se pune un # în față, se obține valoarea returnată „#F41928F1”.

Funcția StringToColor primește un string din care se șterge primul caracter (#) și se iau rând pe rând 2 câte 2 caractere din el: din primele 2 se obține un int cu nr. transformat în baza 10 din baza 16, la fel din celelalte. Apoi se folosește metoda statică Color.FromArgb apelată cu cele 4 valori definitorii ale unei culori: a, r, g, b.

Cele 2 metode sunt inverse una alteia.

Dacă sunt folosite în producție, aceste metode trebuie făcute să intercepteze excepțiile posibile (try - catch - finally). Doar metoda StringToColor necesită modificări în acest caz:

internal static Color StringToColor(string str)
{
    try
    {
        int a = Int32.Parse(str.Substring(1, 2), System.Globalization.NumberStyles.HexNumber);
        int r = Int32.Parse(str.Substring(3, 2), System.Globalization.NumberStyles.HexNumber);
        int g = Int32.Parse(str.Substring(5, 2), System.Globalization.NumberStyles.HexNumber);
        int b = Int32.Parse(str.Substring(7, 2), System.Globalization.NumberStyles.HexNumber);

        return Color.FromArgb(a, r, g, b);
    }
    catch (Exception)
    {
        return Color.Empty;
    }
}



Niciun comentariu:

Trimiteți un comentariu