convert RGB to HLS

double hue2rgb( float p, float q, float rgb )
{
 double color;
 
 if ( rgb < 0.f ){
  rgb = rgb + 1.f;
 }
 if ( rgb > 1.f ){
  rgb = rgb - 1.f;
 }
 
 if ( 6.f * rgb < 1 )
 {
  color = p + ( q - p ) * 6.0 * rgb;
 }
 else if ( 2.0 * rgb < 1 )
 {
  color = q;
 }
 else if ( 3.0 * rgb < 2 )
 {
  color = p + ( q - p ) * ( ( 2.0 / 3.0 ) - rgb ) * 6.0;
 }
 else 
 {
  color = p;
 }
 return color;
}
void rgb2hls(DWORD rgb, float &hue, float &lum, float &sat)
{
 float r, g, b;
 float rgb_min, rgb_max, delta;
 
 r = GetRValue( rgb ) / 255.0; //Where RGB values = 0 / 255
 g = GetGValue( rgb ) / 255.0;
 b = GetBValue( rgb ) / 255.0;
 
 rgb_max = max( r, max( g, b ) );
 rgb_min = min( r, min( g, b ) );
 delta = rgb_max - rgb_min;
 
 if ( !delta ){
  hue = 0.f;
  sat = 0.f;
 }
 else if ( rgb_max == r ){
  if ( g >= b ){
  hue = 60 * ( g - b ) / delta;
  }
  else {
  hue = 60 * ( g - b ) / delta + 360;
  }
 }
 else if ( rgb_max == g){
  hue = 60 * ( b - r ) / delta + 120;
 }
 else /*if ( rgb_max == b )*/{
  hue = 60 * ( r - g ) / delta + 240;
 }
 
 lum = ( rgb_max + rgb_min ) / 2.f;
 
 if ( lum == 0.f ){
  sat = 0.f;
 }
 else if ( lum <= 0.5f ){
  sat = delta / ( 2 * lum );
 }
 else {
  sat = delta / ( 2 - 2 * lum );
 }
 
}

void hls2rgb(float hue, float lum, float sat, DWORD &rgb)
{
 float q, p;
 float r, g, b;
 float h;
 float tr, tg, tb;
 
 if ( sat == 0.f ){
  r = hue * 255.f;
  g = hue * 255.f;
  b = hue * 255.f;
 }
 else {
  if ( lum < 0.5f ){
  q = lum * ( 1.f + sat );
  }
  else {
  q = lum + sat - ( lum * sat );
  }
  p = 2.f * lum - q;
  
  h = hue / 360.f;
  //h = hue;
  
  tr = h + 1.f / 3.0f;
  tg = h;
  tb = h - 1.f / 3.0f;
  
  r = hue2rgb( p, q, tr );
  g = hue2rgb( p, q, tg );
  b = hue2rgb( p, q, tb );

  r *= 255.f;
  g *= 255.f;
  b *= 255.f;

  rgb = RGB( (BYTE)r, (BYTE)g, (BYTE)b );
 }
}


Reference:

http://zh.wikipedia.org/wiki/HSL和HSV色彩空间

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值