2010-05-24 5 views
12

Ich habe in den Dokumenten nach einem HsbToRgb-Konverter gesucht, aber nichts gefunden, das "hsb" oder "hsl" enthält, also schätze ich, dass es einfach nicht existiert. Nur um sicher zu gehen, gibt es irgendwelche Klassen, die diese Konvertierung unterstützen?Verfügt das .NET Framework 3.5 über einen HsbToRgb-Konverter oder muss ich selbst einen Rollout durchführen?

aktualisieren

landete ich mit diesem gehen, die als 0xA3 ist etwas anders. Ich fügte auch eine AhsbToArgb hinzu, also kann ich in RGB umwandeln und den Alphakanal in einer Aufnahme einstellen.

AhsbToArgb - ermöglicht alpha channel:

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 - konvertiert Farbton-Sättigung-Helligkeit zu rot-grün-blau:

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 - verdoppelt ints umwandelt und gibt eine Farb Objekt:

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

tun die Fische: http: //en.wikipedia. org/wiki/HSL_and_HSV –

Antwort

14

Nein, es nicht so weit ich weiß. Aber der Algorithmus ist nicht sehr kompliziert, und Sie werden Arbeitscode im Web wie das zu diesem Artikel Codeproject auf Manipulating colors in .NET von Guillaume Leparmentier finden:

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

Nun, das ist praktisch. Klar und auf den Punkt. – Rusty

+0

Schöne Antwort, danke! – devuxer

+0

... obwohl ich gerade bemerkt habe, scheint dies zweimal "b" zu erklären. – devuxer

5

Nein, In .NET (bis einschließlich 4,0) konvertiert die Klasse nur automatisch von RGB in HSB (über die Methoden GetHue, GetSaturation und GetBrightness). Sie haben eine eigene Methode rollen von HSB-Werte gehen Werte in RGB, oder verwenden Sie eine bereits geschriebene Beispiel wie:

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

Verwandte Themen