原文出处:http://topic.youkuaiyun.com/t/20020801/09/915451.html
以下代码是RGB-〉HSI 和HSI-〉RGB的 代码实现
void _colour_struct::ChangedColourFromRGBStandardtoHSL( )
{
#ifdef _DEBUG
//ASSERT( _colour_administer::GetGlobalColourStructStandard( ) == HSL_COLOUR_STANDARD );
#endif
short R_value_in_rgb = this -> m_redColourValue;
short G_value_in_rgb = this -> m_greenColourValue;
short B_value_in_rgb = this -> m_blueColourValue;
float R = ((float)R_value_in_rgb) / 255;
float G = ((float)G_value_in_rgb) / 255;
float B = ((float)B_value_in_rgb) / 255;
if( R_value_in_rgb == G_value_in_rgb && G_value_in_rgb == B_value_in_rgb )
{
int nHValue = 0;
int nSValue = 0;
int nLValue = ((float)R_value_in_rgb )/ 255 * 100;
this -> m_redColourValue = nHValue;
this -> m_greenColourValue = nSValue;
this -> m_blueColourValue = nLValue;
return;
}
float max_value_of_rgb = GetMax( R, G, B );
float min_value_of_rgb = GetMin( R, G, B );
float fSumRGB = R + G + B;
if( fSumRGB <= 0.0 )
fSumRGB = 0.001;
float I = ( R + G + B ) / 3;
float S = 1.0 - 3.0 * min_value_of_rgb / fSumRGB;
float H = acos( (( R - G ) + ( R - B ))/2 / sqrt( ( R - G )*( R - G ) + ( R -B ) * ( G - B) + 0.0001 ) );
float fHAngle = H / PIE_VALUE * 180;
//int nHAngle = fHAngle;
if( G < B )
fHAngle = 360 - fHAngle;
if( fHAngle > 360.0 )
fHAngle = 360.0;
int nHValue = fHAngle / 360 * 255;
int nSValue = S * 100;
int nLValue = I * 100;
this -> m_redColourValue = nHValue;
this -> m_greenColourValue = nSValue;
this -> m_blueColourValue = nLValue;
}
void _colour_struct::ChangedColourFromHSLStandardtoRGB( )
{
int nHValue = this -> m_redColourValue;
int nSValue = this -> m_greenColourValue;
int nLValue = this -> m_blueColourValue;
float fHAngle = ((float)nHValue ) / 255 * 360;
float H = fHAngle / 180 * PIE_VALUE;
float S = ((float)nSValue ) / 100;
float I = ((float)nLValue ) / 100;
BOOL bLocalEndFlag = FALSE;
_double_value_range h_range_0_to_120( 0, 120 );
_double_value_range h_range_120_to_240( 120, 240 );
_double_value_range h_range_240_to_360( 240, 360 );
float R = -1;
float G = -1;
float B = -1;
if( bLocalEndFlag == FALSE && h_range_0_to_120.IsInRange( fHAngle ) )
{
B = I * ( 1.0 - S );
R = I * ( 1.0 + ( S * cos( H ) / cos( 60.0 / 180 * PIE_VALUE - H ) ) );
G = 3.0 * I - ( B + R );
bLocalEndFlag = TRUE;
}
if( bLocalEndFlag == FALSE && h_range_120_to_240.IsInRange( fHAngle ) )
{
R = I * ( 1.0 - S );
G = I * ( 1.0 + S * cos( H - 120.0 / 180 * PIE_VALUE ) / cos( 180.0 / 180 * PIE_VALUE - H ) );
B = 3.0 * I - ( R + G );
bLocalEndFlag = TRUE;
}
if( bLocalEndFlag == FALSE && h_range_240_to_360.IsInRange( fHAngle ) )
{
G = I * ( 1.0 - S );
B = I * ( 1.0 + S * cos( H - 240.0 / 180 * PIE_VALUE ) / cos( 300.0 / 180 * PIE_VALUE - H ) );
R = 3.0 * I - ( G + B );
bLocalEndFlag = TRUE;
}
int R_value_in_rgb = R * 255;
int G_value_in_rgb = G * 255;
int B_value_in_rgb = B * 255;
this -> m_redColourValue = R_value_in_rgb;
this -> m_greenColourValue= G_value_in_rgb;
this -> m_blueColourValue = B_value_in_rgb;
}