2011-12-06 146 views
0

我在這個論壇發現了這個代碼,但我對代碼有懷疑。HSV/RGB色彩空間轉換

  1. in this code snippet「int hi = Convert.ToInt32(Math.Floor(hue/60))%6;」爲什麼完整的答案是6模數? (%6)

  2. 爲什麼「value = value * 255」的值乘以255?

    即時通訊研究論文(p-15,p-16)和相同的算法進行了討論,但我發現這些差異。

    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. 關於

    INT HI = Convert.ToInt32(Math.Floor(色調/ 60))%6;

色調可表示爲大於360或小於0,如果有顏色轉換涉及的代碼其他部分不確認分模360 如果你是100%,確保所有其他函數將在[0,360]內返回Hue,則不需要模6。

  1. 在HSV中,值通常歸一化爲[0,1]連續區間,而在離散[0,255]區間中爲RGB。因此二者:

    value = value * 255; 
    

 value = max/255d;