2012-01-13 2 views
1

RGB byte 어레이를 HSL float 어레이로 변환하고 다시 변환하는 알고리즘이 있습니까?RGB 바이트를 HSL로 변환 한 후 다시 표시 하시겠습니까?

나는 here을 찾았지만 버그가있는 것으로 보입니다.

+0

@ 매트되지 않음 : 원래 작성자에게 사과, 내가 참조를 찾을 수 없습니다. 이것들은 같은 것이 아닙니다. –

+0

사실, 나쁘다. 나는 코멘트를 삭제했다. – Matt

답변

6

다음 클래스를 사용하여 HSL에서 RGB로 또는 그 반대로 변환합니다. Color에서 ColorRGB 인스턴스를 만들거나 간단히 인스턴스를 생성 할 수 있습니다. 그것은 H, S, L 속성을 노출합니다. 나는 인터넷에서 그것을 발견했다. 귀하의 링크가 HSV를 의미하는 반면이 질문은 특히, HSL에 대한 요구로 중복

public class ColorRGB 
    { 
    public byte R; 
    public byte G; 
    public byte B; 
    public byte A; 

    public ColorRGB() 
    { 
     R = 255; 
     G = 255; 
     B = 255; 
     A = 255; 
    } 

    public ColorRGB(Color value) 
    { 
     this.R = value.R; 
     this.G = value.G; 
     this.B = value.B; 
     this.A = value.A; 
    } 
    public static implicit operator Color(ColorRGB rgb) 
    { 
     Color c = Color.FromArgb(rgb.A, rgb.R, rgb.G, rgb.B); 
     return c; 
    } 
    public static explicit operator ColorRGB(Color c) 
    { 
     return new ColorRGB(c); 
    } 


    // Given H,S,L in range of 0-1 
    // Returns a Color (RGB struct) in range of 0-255 
    public static ColorRGB FromHSL(double H, double S, double L) 
    { 
     return FromHSLA(H, S, L, 1.0); 
    } 

    // Given H,S,L,A in range of 0-1 
    // Returns a Color (RGB struct) in range of 0-255 
    public static ColorRGB FromHSLA(double H, double S, double L, double A) 
    { 
     double v; 
     double r, g, b; 
     if (A > 1.0) 
     A = 1.0; 

     r = L; // default to gray 
     g = L; 
     b = L; 
     v = (L <= 0.5) ? (L * (1.0 + S)) : (L + S - L * S); 
     if (v > 0) 
     { 
     double m; 
     double sv; 
     int sextant; 
     double fract, vsf, mid1, mid2; 

     m = L + L - v; 
     sv = (v - m)/v; 
     H *= 6.0; 
     sextant = (int)H; 
     fract = H - sextant; 
     vsf = v * sv * fract; 
     mid1 = m + vsf; 
     mid2 = v - vsf; 
     switch (sextant) 
     { 
      case 0: 
      r = v; 
      g = mid1; 
      b = m; 
      break; 
      case 1: 
      r = mid2; 
      g = v; 
      b = m; 
      break; 
      case 2: 
      r = m; 
      g = v; 
      b = mid1; 
      break; 
      case 3: 
      r = m; 
      g = mid2; 
      b = v; 
      break; 
      case 4: 
      r = mid1; 
      g = m; 
      b = v; 
      break; 
      case 5: 
      r = v; 
      g = m; 
      b = mid2; 
      break; 
     } 
     } 
     ColorRGB rgb = new ColorRGB(); 
     rgb.R = Convert.ToByte(r * 255.0f); 
     rgb.G = Convert.ToByte(g * 255.0f); 
     rgb.B = Convert.ToByte(b * 255.0f); 
     rgb.A = Convert.ToByte(A * 255.0f); 
     return rgb; 
    } 

    // Hue in range from 0.0 to 1.0 
    public float H 
    { 
     get 
     { 
     // Use System.Drawing.Color.GetHue, but divide by 360.0F 
     // because System.Drawing.Color returns hue in degrees (0 - 360) 
     // rather than a number between 0 and 1. 
     return ((Color)this).GetHue()/360.0F; 
     } 
    } 

    // Saturation in range 0.0 - 1.0 
    public float S 
    { 
     get 
     { 
     return ((Color)this).GetSaturation(); 
     } 
    } 

    // Lightness in range 0.0 - 1.0 
    public float L 
    { 
     get 
     { 
     return ((Color)this).GetBrightness(); 
     } 
    } 
    } 
+1

생각 나는 원래 링크를 추가 할 것입니다. :) http://www.geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm –

+0

감사합니다. 코드를 검색 할 때 찾지 못했습니다. 다행히 원저자의 성격을 알 수 있습니다. 그것은 나에게 너무 영리합니다 ;-) – ColinE

+0

링크가 끊어졌지만 www가없이 작동합니다. http://geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm –

관련 문제