根据公式得出的hue是度数,sat和val是比值,再做转换。
#define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max3(a,b,c) (((a) > (b) ? (a) : (b)) > (c) ? ((a) > (b) ? (a) : (b)) : (c))
#define min3(a,b,c) (((a) < (b) ? (a) : (b)) < (c) ? ((a) < (b) ? (a) : (b)) : (c))
void rgb2hsv(const CRGB& rgb, CHSV& hsv)
{
float max, min, delta=0;
float r = (float)((float)((int)rgb.r)/255);
float g = (float)((float)((int)rgb.g)/255);
float b = (float)((float)((int)rgb.b)/255);
float hue = 0;
float sat = 0;
float val = 0;
max = max3(r, g, b);
min = min3(r, g, b);
delta = (max - min);
if (delta == 0) {
hue = 0;
} else {
if (r == max) {
hue = ((g-b)/delta)*60;
} else if (g == max) {
hue = 120+(((b-r)/delta)*60);
} else if (b == max) {
hue = 240 + (((r-g)/delta)*60);
}
if (hue < 0) {
hue += 360;
}
}
if (max == 0) {
sat = 0;
} else {
sat = (float)(delta/max);
}
val = max;
hsv.h = hue / 360 * 255;
hsv.s = sat * 255;
hsv.v = val * 255;
}