tools.cpp
上传用户:xiaoke98
上传日期:2014-06-29
资源大小:5718k
文件大小:3k
源码类别:

家庭/个人应用

开发平台:

Visual C++

  1. //tools.cpp
  2. #include "stdafx.h"
  3. #include "tools.h"
  4. ///////////////////////////////////////////////////////////////////////////////
  5. COLORREF HLS_TRANSFORM (COLORREF rgb, int percent_L, int percent_S)
  6. {
  7.     HLSCOLOR hls = RGB2HLS (rgb);
  8.     BYTE h = HLS_H(hls);
  9.     BYTE l = HLS_L(hls);
  10.     BYTE s = HLS_S(hls);
  11.     if ( percent_L > 0 )
  12.     {
  13.         l = BYTE(l + ((255 - l) * percent_L) / 100);
  14.     }
  15.     else if ( percent_L < 0 )
  16.     {
  17.         l = BYTE((l * (100+percent_L)) / 100);
  18.     }
  19.     if ( percent_S > 0 )
  20.     {
  21.         s = BYTE(s + ((255 - s) * percent_S) / 100);
  22.     }
  23.     else if ( percent_S < 0 )
  24.     {
  25.         s = BYTE((s * (100+percent_S)) / 100);
  26.     }
  27.     return HLS2RGB (HLS(h, l, s));
  28. }
  29. ///////////////////////////////////////////////////////////////////////////////
  30. COLORREF HLS2RGB (HLSCOLOR hls)
  31. {
  32.     float hue        = ((int)HLS_H(hls)*360)/255.0f;
  33.     float luminance  = HLS_L(hls)/255.0f;
  34.     float saturation = HLS_S(hls)/255.0f;
  35.     if ( saturation == 0.0f )
  36.     {
  37.         return RGB (HLS_L(hls), HLS_L(hls), HLS_L(hls));
  38.     }
  39.     float rm1, rm2;
  40.      
  41.     if ( luminance <= 0.5f ) rm2 = luminance + luminance * saturation;  
  42.     else                     rm2 = luminance + saturation - luminance * saturation;
  43.     rm1 = 2.0f * luminance - rm2;   
  44.     BYTE red   = _ToRGB (rm1, rm2, hue + 120.0f);   
  45.     BYTE green = _ToRGB (rm1, rm2, hue);
  46.     BYTE blue  = _ToRGB (rm1, rm2, hue - 120.0f);
  47.     return RGB (red, green, blue);
  48. }
  49. ///////////////////////////////////////////////////////////////////////////////
  50. static BYTE _ToRGB (float rm1, float rm2, float rh)
  51. {
  52.   if      (rh > 360.0f) rh -= 360.0f;
  53.   else if (rh <   0.0f) rh += 360.0f;
  54.  
  55.   if      (rh <  60.0f) rm1 = rm1 + (rm2 - rm1) * rh / 60.0f;   
  56.   else if (rh < 180.0f) rm1 = rm2;
  57.   else if (rh < 240.0f) rm1 = rm1 + (rm2 - rm1) * (240.0f - rh) / 60.0f;      
  58.                    
  59.   return (BYTE)(rm1 * 255);
  60. }
  61. ///////////////////////////////////////////////////////////////////////////////
  62. HLSCOLOR RGB2HLS (COLORREF rgb)
  63. {
  64.     unsigned char minval = min(GetRValue(rgb), min(GetGValue(rgb), GetBValue(rgb)));
  65.     unsigned char maxval = max(GetRValue(rgb), max(GetGValue(rgb), GetBValue(rgb)));
  66.     float mdiff  = float(maxval) - float(minval);
  67.     float msum   = float(maxval) + float(minval);
  68.    
  69.     float luminance = msum / 510.0f;
  70.     float saturation = 0.0f;
  71.     float hue = 0.0f; 
  72.     if ( maxval != minval )
  73.     { 
  74.         float rnorm = (maxval - GetRValue(rgb)  ) / mdiff;      
  75.         float gnorm = (maxval - GetGValue(rgb)) / mdiff;
  76.         float bnorm = (maxval - GetBValue(rgb) ) / mdiff;   
  77.         saturation = (luminance <= 0.5f) ? (mdiff / msum) : (mdiff / (510.0f - msum));
  78.         if (GetRValue(rgb) == maxval) hue = 60.0f * (6.0f + bnorm - gnorm);
  79.         if (GetGValue(rgb) == maxval) hue = 60.0f * (2.0f + rnorm - bnorm);
  80.         if (GetBValue(rgb) == maxval) hue = 60.0f * (4.0f + gnorm - rnorm);
  81.         if (hue > 360.0f) hue = hue - 360.0f;
  82.     }
  83.     return HLS ((hue*255)/360, luminance*255, saturation*255);
  84. }