2011-12-06 20 views
0

私はこのフォーラムでこのコードを見つけましたが、コードには疑問があります。このコードスニペットに HSV/RGBカラースペース変換

  1. "INT HI = 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. HI = Convert.ToInt32(Math.Floor(色相/ 60))%6。あなたは必ずそのすべてが100%であれば 360 MODを分割することを確認していないコードの他の部分に関わるカラー変換がある場合は色相は、0より大きくより360または小さいとして表現される可能性があります

他の関数は[0,360]内で色相を返すことになり、モジュロ6は必要ありません。

  1. 通常、値は[0,1]連続間隔で正規化されますが、離散的[0,255]間隔ではRGBで正規化されます。したがって、両方:色相は円筒座標で色が変化するため

    value = value * 255; 
    

 value = max/255d; 
関連する問題