2011-12-06 4 views
0

이 코드는이 포럼에서 발견되었지만 코드에는 의심의 여지가 있습니다. 이 코드에 HSV/RGB 색상 공간 변환

  1. "안녕 = INT Convert.ToInt32 (Math.Floor (색조/60)) 6 %;" 왜 완전 역은 6에 의한 모듈러스인가? (% 6)

  2. 왜 "값 = 값 * 255"값에 255가 곱해 집니까?

    이 연구 보고서 (p-15, p-16)를 참조하면 동일한 알고리즘이 논의되지만 이러한 차이점을 발견했습니다.

    INT 대하여

    http://www.poynton.com/PDFs/coloureq.pdf

    public static Color ColorFromHSV(double hue, double saturation, double value) 
    { 
        int hi = Convert.ToInt32(Math.Floor(hue/60)) % 6; 
        double f = hue/60 - Math.Floor(hue/60); 
    
        value = value * 255; 
        int v = Convert.ToInt32(value); 
        int p = Convert.ToInt32(value * (1 - saturation)); 
        int q = Convert.ToInt32(value * (1 - f * saturation)); 
        int t = Convert.ToInt32(value * (1 - (1 - f) * saturation)); 
    
        if (hi == 0) 
        return Color.FromArgb(255, v, t, p); 
        else if (hi == 1) 
        return Color.FromArgb(255, q, v, p); 
        else if (hi == 2) 
        return Color.FromArgb(255, p, v, t); 
        else if (hi == 3) 
        return Color.FromArgb(255, p, q, v); 
        else if (hi == 4) 
        return Color.FromArgb(255, t, p, v); 
        else 
        return Color.FromArgb(255, v, p, q); 
    } 
    
    public void convertToHSV(Color color, out double hue, out double saturation, out double value) 
    { 
        int max = Math.Max(color.R, Math.Max(color.G, color.B)); 
        int min = Math.Min(color.R, Math.Min(color.G, color.B)); 
    
        hue = color.GetHue(); 
        saturation = (max == 0) ? 0 : 1d - (1d * min/max); 
        value = max/255d; 
    
    } 
    
+0

는 무엇입니까? 친구들이 나를 도와 주네. –

답변

0
  1. 하이 = Convert.ToInt32 (Math.Floor (색조/60)) 6 %;

당신이 모든 것을 확실히 100 % 인 경우 모드 360 을 나눌 수 있는지 확인하지 않는 코드의 다른 부분에 관여하는 색상 변환이있는 경우 색조,보다 큰 360 또는 0보다 작은으로 표현 될 수있다 다른 함수들은 [0,360] 내에서 색조를 반환 할 것이고 모듈로 6은 필요하지 않습니다. HSV에서

  1. 는, 이산 값은 [0,255] 구간에서 RGB 반면, 상기 [0,1]의 연속 구간 전형적 정규화된다. 따라서 둘 모두 색조가 원통 좌표 변색 때문에

    value = value * 255; 
    

 value = max/255d;