Преобразование цветового пространства HSV / RGB

Я нашел этот код на этом форуме, но у меня возникли сомнения по поводу кода.

  1. в этом фрагменте кода "int hi = Convert.ToInt32 (Math.Floor (hue / 60))% 6;" почему полный ответ - модуль на 6? (% 6)

  2. почему значение "значение = значение * 255" умножается на 255?

    Я ссылаюсь на эту исследовательскую работу (стр. 15, стр. 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;
    
    }
    

person Visuddha Karunaratne    schedule 06.12.2011    source источник
comment
это потому, что оттенок меняет свой цвет в цилиндрических координатах? ребята выручайте меня   -  person Visuddha Karunaratne    schedule 07.12.2011


Ответы (1)


  1. Касательно

    int hi = Convert.ToInt32 (Math.Floor (оттенок / 60))% 6;

Оттенок может быть представлен как больше 360 или меньше 0, если есть преобразования цвета, задействованные в других частях кода, которые не обеспечивают разделение мода 360. Если вы на 100% уверены, что все другие функции будут возвращать оттенок в пределах [0,360], то по модулю 6 нет необходимости.

  1. В HSV значение обычно нормализуется к непрерывному интервалу [0,1], тогда как в RGB - к дискретному интервалу [0,255]. Следовательно, оба:

      value = value * 255;
    

а также

      value = max / 255d;
person Leonidas K    schedule 03.01.2012