Convertir une string RGB en objet Color

Convertir une string RGB en objet Color

Il est parfois utile d’avoir la possibilité de convertir un code couleur en objet Color afin de pouvoir colorier des éléments de l’interface selon des données distantes. C’est ce que je fais par exemple dans la partie explorer de 6sec où les couleurs de chaque mot clé proviennent du serveur avec utilisé pour la génération de la live tile et la couleur de l’application bar par exemple.

Quelques rappels pour les débutants

Si vous souhaitez juste affecter la couleur d’un contrôle (par exemple un foreground ou un background), pas besoin de vous prendre la tête, faites juste un “{Binding MaCouleurEnString}” le moteur xaml et de binding s’occupera de parser tout cela.

Dans la suite de l’article, on va plutôt parler de solutions pour récupérer la couleur afin par exemple :

  • de faire des traitements dessus (calculer la couleur inverse, des nuances de couleurs)
  • affecter le fond d’une iconic tile
  • ou encore changer la couleur d’une appbar

et encore, pour le dernier cas on peut se contenter d’une dependency property et d’un binding

Alors comment faire cela le plus efficacement possible ?

Puisque l’on parle de performance, il est hors de question d’utiliser un XAMLReader, trop lourd pour notre utilisation et limité au thread UI.

Dans une première version, j’utilisais un petit parser qui récupérait la string, la découpait, puis calculait chacune des composantes R, G, B, A.


public Color HexToColor(string hex)
{
//on supprime le #
hex = hex.Replace("#", "");

byte a = 255;
byte r = 255;
byte g = 255;
byte b = 255;

int start = 0;

//gestion des couleurs ARGB
if (hex.Length == 8)
{
a = byte.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber);
start = 2;
}

//récupération des composantes R,G, B
r = byte.Parse(hex.Substring(start, 2), System.Globalization.NumberStyles.HexNumber);
g = byte.Parse(hex.Substring(start + 2, 2), System.Globalization.NumberStyles.HexNumber);
b = byte.Parse(hex.Substring(start + 4, 2), System.Globalization.NumberStyles.HexNumber);

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

Ca fonctionne, mais on peut faire beaucoup mieux en considérant la string comme un seul nombre hexadécimal et non 3 ou 4.


public Color HexToColor(string hex)
{
//on supprime le #
hex = hex.Replace("#", "");
var val=Int32.Parse(hex, System.Globalization.NumberStyles.HexNumber);

byte alpha = 255;
//gestion des couleurs ARGB
if (hex.Length == 8)
{
alpha =(byte)( val >> 24);
}
return Color.FromArgb(alpha,(byte)((val >> 16) & 0xff),(byte)( (val >> 8) & 0xff), (byte)(val & 0xff));
}

Et en .Net ?

Color dispose d’une méthode Color.FromArgb très peu connu uniquement en .net (pas en silverlight et donc windows phone) : Color.FromArgb(int)

http://msdn.microsoft.com/fr-fr/library/2zys7833.aspx

Pas besoin de découper R,G, B ou A, il suffit juste de donner la valeur du nombre hexadécimal.

Pour cela, rien de plus simple :


Color.FromArgb(Int32.Parse(hexcolor.Replace("#", ""), System.Globalization.NumberStyles.HexNumber));

Voilà !!!

Bonus

Allez, en bonus, voyons comment gérer les couleurs html comme “red” ou “blue” en .Net


System.Drawing.ColorTranslator.FromHtml(xCol);

Update: Toujours en .Net, on peut utiliser ColorConverter.ConvertFromString(monstring) qui a l’avantage de gérer à la fois les codes rgb mais aussi les couleurs nommées (merci Benjamin !)

 

 

 

Comments are closed.