void IrisBitmap::BitmapRGBtoHSL(const COLOR_RGB *rgb, COLOR_HSL *hsl) { float h=0, s=0, l=0; // normalizes red-green-blue values float r = rgb->red/255.f; float g = rgb->green/255.f; float b = rgb->blue/255.f; float maxVal = max3v(r, g, b); float minVal = min3v(r, g, b); // hue if(maxVal == minVal) { h = 0; // undefined } else if(maxVal==r && g>=b) { h = 60.0f*(g-b)/(maxVal-minVal); } else if(maxVal==r && g<b) { h = 60.0f*(g-b)/(maxVal-minVal) + 360.0f; } else if(maxVal==g) { h = 60.0f*(b-r)/(maxVal-minVal) + 120.0f; } else if(maxVal==b) { h = 60.0f*(r-g)/(maxVal-minVal) + 240.0f; } // luminance l = (maxVal+minVal)/2.0f; // saturation if(l == 0 || maxVal == minVal) { s = 0; } else if(0<l && l<=0.5f) { s = (maxVal-minVal)/(maxVal+minVal); } else if(l>0.5f) { s = (maxVal-minVal)/(2 - (maxVal+minVal)); //(maxVal-minVal > 0)? } hsl->hue = (h>360)? 360 : ((h<0)?0:h); hsl->saturation = ((s>1)? 1 : ((s<0)?0:s))*100; hsl->luminance = ((l>1)? 1 : ((l<0)?0:l))*100; }
//RGB转HSL static void RGBtoHSL(const COLOR_RGB *Rgb, COLOR_HSL *Hsl) { int h,s,l,maxVal,minVal,difVal; int r = Rgb->red; int g = Rgb->green; int b = Rgb->blue; maxVal = max3v(r, g, b); minVal = min3v(r, g, b); difVal = maxVal-minVal; //计算亮度 l = (maxVal+minVal)*240/255/2; if(maxVal == minVal)//若r=g=b { h = 0; s = 0; } else { //计算色调 if(maxVal==r) { if(g>=b) h = 40*(g-b)/(difVal); else h = 40*(g-b)/(difVal) + 240; } else if(maxVal==g) h = 40*(b-r)/(difVal) + 80; else if(maxVal==b) h = 40*(r-g)/(difVal) + 160; //计算饱和度 if(l == 0) s = 0; else if(l<=120) s = (difVal)*240/(maxVal+minVal); else s = (difVal)*240/(511 - (maxVal+minVal)); } Hsl->hue = (unsigned char)(((h>240)? 240 : ((h<0)?0:h))); Hsl->saturation = (unsigned char)(((s>240)? 240 : ((s<0)?0:s))); Hsl->luminance = (unsigned char)(((l>240)? 240 : ((l<0)?0:l))); }