网上的转换方式千奇百怪,让我很是郁闷,我贴一个靠谱的函数
//
R, G, B:[0..255],integer
// H:[0, 360),double, degrees around color circle
// S:[0, 1], double, 0(shade of gray) to 1(pure color)
// V:[0, 1], double, 0(black) to 1(white)
void RGB2HSV( int R, int G, int B, double & H, double & S, double & V)
... {
int Max = max(max(R, G), B);
int Min = min(min(R, G), B);
int Delta = Max - Min;
if(Max == 0)
S = 0.0;
else
S = (double)Delta/Max;
if(abs(S)<FLT_EPSILON)
H = 0.0; //当S为0时,H无意义, 但可以指定为0
else
...{
if(R == Max) //yellow to magenta
H = 60*(G-B)/Delta;
else if(G == Max) //cyan to yellow
H = 120+60*(B-R)/Delta;
else if(B == Max) //magenta to cyan
H = 240+60*(R-G)/Delta;
}
if(H<0.0)
H = 360.0 + H;
if(H>360.0)
H-=360;
V = Max/255.0;
}
// H:[0, 360),double, degrees around color circle
// S:[0, 1], double, 0(shade of gray) to 1(pure color)
// V:[0, 1], double, 0(black) to 1(white)
void RGB2HSV( int R, int G, int B, double & H, double & S, double & V)
... {
int Max = max(max(R, G), B);
int Min = min(min(R, G), B);
int Delta = Max - Min;
if(Max == 0)
S = 0.0;
else
S = (double)Delta/Max;
if(abs(S)<FLT_EPSILON)
H = 0.0; //当S为0时,H无意义, 但可以指定为0
else
...{
if(R == Max) //yellow to magenta
H = 60*(G-B)/Delta;
else if(G == Max) //cyan to yellow
H = 120+60*(B-R)/Delta;
else if(B == Max) //magenta to cyan
H = 240+60*(R-G)/Delta;
}
if(H<0.0)
H = 360.0 + H;
if(H>360.0)
H-=360;
V = Max/255.0;
}