2010-05-24 1 views
12

J'ai fait une recherche pour un convertisseur HsbToRgb dans les docs mais je n'ai rien trouvé contenant "hsb" ou "hsl", donc je devine que ça n'existe pas. Juste pour s'assurer, cependant, y a-t-il des classes qui soutiennent cette conversion?.NET Framework 3.5 dispose-t-il d'un convertisseur HsbToRgb ou dois-je lancer le mien?

Mise à jour

Je fini par aller avec ce qui est légèrement différent de celui 0xA3 de. J'ai également ajouté un AhsbToArgb afin que je puisse convertir en RVB et définir le canal alpha en une seule fois.

AhsbToArgb - permet un canal alpha:

public static Color AhsbToArgb(byte a, double h, double s, double b) 
{ 
    var color = HsbToRgb(h, s, b); 
    return Color.FromArgb(a, color.R, color.G, color.B); 
} 

HsbToRgb - convertit la teinte-saturation-luminosité au rouge-vert-bleu:

public static Color HsbToRgb(double h, double s, double b) 
{ 
    if (s == 0) 
     return RawRgbToRgb(b, b, b); 
    else 
    { 
     var sector = h/60; 
     var sectorNumber = (int)Math.Truncate(sector); 
     var sectorFraction = sector - sectorNumber; 
     var b1 = b * (1 - s); 
     var b2 = b * (1 - s * sectorFraction); 
     var b3 = b * (1 - s * (1 - sectorFraction)); 
     switch (sectorNumber) 
     { 
      case 0: 
       return RawRgbToRgb(b, b3, b1); 
      case 1: 
       return RawRgbToRgb(b2, b, b1); 
      case 2: 
       return RawRgbToRgb(b1, b, b3); 
      case 3: 
       return RawRgbToRgb(b1, b2, b); 
      case 4: 
       return RawRgbToRgb(b3, b1, b); 
      case 5: 
       return RawRgbToRgb(b, b1, b2); 
      default: 
       throw new ArgumentException("Hue must be between 0 and 360"); 
     } 
    } 
} 

RawRgbToRgb - convertit doubles à ints et renvoie une couleur objet:

private static Color RawRgbToRgb(double rawR, double rawG, double rawB) 
{ 
    return Color.FromArgb(
     (int)Math.Round(rawR * 255), 
     (int)Math.Round(rawG * 255), 
     (int)Math.Round(rawB * 255)); 
} 
+0

Faire le poisson: http: //en.wikipedia. org/wiki/HSL_and_HSV –

Répondre

14

Non, il n'a pas pour autant que je sache. Mais l'algorithme est pas très compliqué et vous trouverez le code de travail sur le Web tel que celui sur cet article CodeProject sur Manipulating colors in .NET par Guillaume Leparmentier:

public static Color HSBtoRGB(double hue, double saturation, double brightness) 
{ 
    double r = 0; 
    double g = 0; 
    double b = 0; 

    if (saturation == 0) 
    { 
     r = g = b = brightness; 
    } 
    else 
    { 
     // The color wheel consists of 6 sectors. 
     // Figure out which sector you're in. 
     // 
     double sectorPos = hue/60.0; 
     int sectorNumber = (int)(Math.Floor(sectorPos)); 

     // get the fractional part of the sector 
     double fractionalSector = sectorPos - sectorNumber; 

     // calculate values for the three axes of the color. 
     double p = brightness * (1.0 - saturation); 
     double q = brightness * (1.0 - (saturation * fractionalSector)); 
     double t = brightness * (1.0 - (saturation * (1 - fractionalSector))); 

     // assign the fractional colors to r, g, and b 
     // based on the sector the angle is in. 
     switch (sectorNumber) 
     { 
      case 0: 
       r = brightness; 
       g = t; 
       b = p; 
       break; 
      case 1: 
       r = q; 
       g = brightness; 
       b = p; 
       break; 
      case 2: 
       r = p; 
       g = brightness; 
       b = t; 
       break; 
      case 3: 
       r = p; 
       g = q; 
       b = brightness; 
       break; 
      case 4: 
       r = t; 
       g = p; 
       b = brightness; 
       break; 
      case 5: 
       r = brightness; 
       g = p; 
       b = q; 
       break; 
     } 
    } 

    return Color.FromArgb(
     (int)(r * 255.0 + 0.5), 
     (int)(g * 255.0 + 0.5), 
     (int)(b * 255.0 + 0.5)); 
} 
+0

Eh bien c'est pratique. Clair et précis. – Rusty

+0

Bonne réponse, merci! – devuxer

+0

... bien que je viens de le remarquer, cela semble déclarer 'b' deux fois. – devuxer

5

Non, Dans .NET (jusqu'à et y compris 4.0), la classe Color ne convertit automatiquement de RGB en HSB (via les méthodes GetHue, GetSaturation et GetBrightness). Vous devez rouler votre propre méthode pour aller de valeurs HSB pour les valeurs RVB, ou utiliser un exemple déjà écrit, comme:

http://www.codeproject.com/KB/GDI-plus/HSBColorClass.aspx

Questions connexes