2010-05-24 4 views
12

문서에서 HsbToRgb 변환기에 대한 검색을 수행했지만 "hsb"또는 "hsl"이 포함 된 것을 찾지 못했기 때문에 그냥 존재하지 않는다고 생각합니다. 그러나이 변환을 지원하는 클래스가 있습니까?.NET Framework 3.5에 HsbToRgb 변환기가 있습니까? 아니면 내 컴퓨터를 롤업해야합니까?

업데이트

나는 동일한 0xA3의 약간의 차이 인이 함께가는 끝났다. 또한 RGB로 변환하고 한 번에 알파 채널을 설정할 수 있도록 AhsbToArgb을 추가했습니다. 적색 - 녹색 - 청색 색조 채도 밝기 변환 -

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 알파 채널을 허용

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 -의 int로 두 배로 변환하고, 색을 돌려 대상 :

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

물고기를 수행. org/wiki/HSL_and_HSV –

답변

14

: 당신처럼, 이미 작성된 예를 들어 값을 RGB 또는 사용하는 HSB 값에서 이동하는 자신의 방법을 롤해야합니다. 그러나 알고리즘은 매우 복잡하지 않습니다 그리고 당신은 기욤 Leparmentier에 의해 Manipulating colors in .NET에이 CodeProject의 기사의 하나로서 웹에서 코드를 작업을 찾을 수 있습니다 : 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

글쎄 그건 편리합니다. 명확하고 요점. – Rusty

+0

좋은 답변, 감사합니다! – devuxer

+0

... 방금 알아 차 렸지만 이것은'b'를 두 번 선언 한 것 같습니다. – devuxer

관련 문제