2010-05-24 14 views
12

Dokümanlardaki bir HsbToRgb dönüştürücüsü için arama yaptım, ancak "hsb" veya "hsl" içeren bir şey bulamadım, bu yüzden var olmadığını tahmin ediyorum. Ancak, emin olmak için, bu dönüşümü destekleyen herhangi bir sınıf var mı?.NET Framework 3.5 bir HsbToRgb dönüştürücüsüne sahip mi, yoksa kendi başıma mı dönmem gerekiyor?

Güncelleme

Ben 0xA3 en biraz daha farklı olan varmaya sona erdi. Ayrıca bir AhsbToArgb ekledim, böylece RGB'ye dönüştürebilir ve alfa kanalı tek çekimde yapabilirim. kırmızı-yeşil-mavi renk-doygunluk-parlaklık dönüştürür -

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: -

AhsbToArgb alfa kanalı sağlar

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 - ints için çiftler dönüştürür ve bir renk verir nesne:

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

balık yapmak. org/wiki/HSL_and_HSV –

cevap

14

: Sen gibi halihazırda yazılı örneği değerlerini RGB veya kullanmak üzere HSB değerlerinden gitmek için kendi yöntemini rulo gerekiyor. Ama algoritma çok karmaşık değildir ve böyle Guillaume Leparmentier tarafından Manipulating colors in .NET bu CodeProject makale biri olarak Web'de çalışan kod bulacaksınız: http: //en.wikipedia

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

Peki bu kullanışlı. Net ve noktaya. – Rusty

+0

Güzel cevap, teşekkürler! – devuxer

+0

... fark ettim bile, bu iki kez "b" beyan ediyor gibi görünüyor. – devuxer

İlgili konular