RGB HSI轉換

 

原文出處:http://topic.csdn.net/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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章