2010-05-24 7 views
12

Hice una búsqueda de un convertidor HsbToRgb en los documentos pero no encontré nada que contenga "hsb" o "hsl", así que supongo que simplemente no existe. Solo para asegurarse, sin embargo, ¿hay alguna clase que soporte esta conversión?¿El .NET Framework 3.5 tiene un convertidor HsbToRgb o necesito transferir el mío?

actualización

Terminé yendo con esto, que es ligeramente diferente a la de 0xA3. También agregué un AhsbToArgb, así que puedo convertir a RGB y configurar el canal alfa en una sola toma.

AhsbToArgb - Permite canal alfa:

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 - Convierte hue-saturación-brillo a rojo-verde-azul:

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 - convierte dobles a ints y devuelve un color objeto:

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

Hacer los peces: http: //en.wikipedia. org/wiki/HSL_and_HSV –

Respuesta

14

No, no por lo que yo sé. Sin embargo, el algoritmo no es muy complicada y se encuentra código en la web de trabajo, tales como el de este artículo CodeProject en Manipulating colors in .NET por 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

Bueno, eso es útil. Claro y al grano. – Rusty

+0

¡Buena respuesta, gracias! – devuxer

+0

... aunque me acabo de dar cuenta, esto parece declarar 'b' dos veces. – devuxer

5

No, en .NET (hasta e incluyendo 4.0) la clase Color solo se convierte automáticamente de RGB a HSB (a través de los métodos GetHue, GetSaturation y GetBrightness). Tienes que rodar su propio método para pasar de los valores HSB a valores RGB, o utilizar un ejemplo ya escrito, como:

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

Cuestiones relacionadas