rgb与hsv互转 c
#include <math.h>
#include "macro.h"
int rgb2hsvi(unsigned char r, unsigned char g, unsigned char b,float* res)
{
float rm = r/255.0, gm = g/255.0, bm = b/255.0;
float cmax = MAX(MAX(rm,gm),bm);
float cmin = MIN(MIN(rm,gm),bm);
float dc = cmax - cmin;
float h;
float s;
float v = cmax;
if (v == 0)
s = 0;
else
s = 1.0 - cmin/v;
if (dc == 0)
h = 0;
else if (cmax == rm)
h = 60*fmodf(((ABS(gm-bm))/dc),6);
else if (cmax == gm)
h = 60 * ((bm - rm) / dc + 2);
else if (cmax == bm)
h = 60 * ((rm - gm) / dc + 4);
res[0] = h;
res[1] = s;
res[2] = v;
}
void hsv2rgb(float* c, float* res)
{
float h = c[0], s = c[1] , v = c[2];
h = fmodf(ABS(h),360.0);
float rs = h/60.0;
float cmax = v;
float cmin = v*(1.0-s);
float dc = cmax - cmin;
float rm,gm,bm;
if( 0 <= h && h < 120){
rm = cmax;
bm = cmin;
gm = rs*dc + bm;
} else if ( 120 <= h && h < 240) {
gm = cmax;
rm = cmin;
bm = (rs-2)*dc + rm;
} else {
bm = cmax;
gm = cmin;
rm = (rs-4)*dc + gm;
}
res[0] = rm;
res[1] = gm;
res[2] = bm;
}
void rgb2hsv(float* c, float* res)
{
unsigned char r = c[0]*255;
unsigned char g = c[1]*255;
unsigned char b = c[2]*255;
rgb2hsvi(r,g,b,res);
}