0

私はこのフォーラムでこのコードを見つけましたが、私はコードに疑問を持っています。

  1. このコードスニペットでは、 "int hi = Convert.ToInt32(Math.Floor(hue / 60))%6;" なぜ完全な答えは6によるモジュラスですか?(%6)

  2. 「値=値*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;
    
    }
    
4

1 に答える 1

0
  1. それにかんする

    int hi = Convert.ToInt32(Math.Floor(色相/60)) % 6;

色変換がコードの他の部分に含まれていて、mod 360 で除算されていない場合、色相は 360 よりも大きいか、0 よりも小さい値として表される可能性があります。 [0,360] の場合、モジュロ 6 は必要ありません。

  1. HSV では、Value は通常 [0,1] 連続間隔に正規化されますが、RGB では離散 [0,255] 間隔に正規化されます。したがって、両方:

      value = value * 255;
    

      value = max / 255d;
于 2012-01-03T14:36:33.057 に答える