我在这个论坛中发现了这个代码,但我对代码有疑问。
在此代码段“int hi = Convert.ToInt32(Math.Floor(hue / 60))%6;”为什么完整的答案是6的模数? (%6)
为什么“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)
关于
int hi = Convert.ToInt32(Math.Floor(hue / 60))%6;
Hue可能表示为大于360或小于0,如果其他代码段中涉及的颜色转换不确定划分mod 360。 如果您100%确定所有其他函数将在[0,360]内返回Hue,则不需要模6。
在HSV中,值通常归一化为[0,1]连续间隔,而在离散[0,255]间隔中归一化为RGB。因此两者:
value = value * 255;
和
value = max / 255d;