|
//---------------------------------------------------------------------------
unsigned char ToRGB1(float rm1, float rm2, float rh)
{
if (rh > 360.0f) rh -= 360.0f;
else if (rh < 0.0f) rh += 360.0f;
if (rh < 60.0f) rm1 = rm1 + (rm2 - rm1) * rh / 60.0f;
else if (rh < 180.0f) rm1 = rm2;
else if (rh < 240.0f) rm1 = rm1 + (rm2 - rm1) * (240.0f - rh) / 60.0f;
return static_cast<unsigned char>(rm1 * 255);
}
//---------------------------------------------------------------------------
void ToRGB(float m_hue,float m_saturation,float m_luminance,int *rr,int *rg,int *rb)
{
float rm1, rm2;
if (m_luminance <= 0.5f) rm2 = m_luminance + m_luminance * m_saturation;
else rm2 = m_luminance + m_saturation - m_luminance * m_saturation;
rm1 = 2.0f * m_luminance - rm2;
*rr = ToRGB1(rm1, rm2, m_hue + 120.0f);
*rg = ToRGB1(rm1, rm2, m_hue);
*rb = ToRGB1(rm1, rm2, m_hue - 120.0f);
}
//---------------------------------------------------------------------------
void ToHLS(int r,int g,int b,float*m_hue,float*m_saturation,float*m_luminance)
{
unsigned char minval = min(r, min(g, b));
unsigned char maxval = max(r, max(g, b));
float mdiff = float(maxval) - float(minval);
float msum = float(maxval) + float(minval);
*m_luminance = msum / 510.0f;
if (maxval == minval)
{
*m_saturation = 0.0f;
*m_hue = 0.0f;
}
else
{
float rnorm = (maxval - r ) / mdiff;
float gnorm = (maxval - g) / mdiff;
float bnorm = (maxval - b ) / mdiff;
*m_saturation = (*m_luminance <= 0.5f) ? (mdiff / msum) : (mdiff / (510.0f - msum));
if (r == maxval) *m_hue = 60.0f * (6.0f + bnorm - gnorm);
if (g == maxval) *m_hue = 60.0f * (2.0f + rnorm - bnorm);
if (b == maxval) *m_hue = 60.0f * (4.0f + gnorm - rnorm);
if (*m_hue > 360.0f) *m_hue = *m_hue - 360.0f;
}
}
//---------------------------------------------------------------------------
출처는 codeproject
보리 님이 쓰신 글 :
: 급한건 아닌데요...
:
: 평소에 궁금한게 있어서요...
:
: 첨부 그림의 색 편집 다이얼로그의 오른 쪽 하단의 빨강, 녹색, 파랑 색 조합을...
:
: 그 왼쪽의 색상, 채도, 명도의 조합으로 바꾸는 API가 있나요?
:
: 숫자 조합을 보면 CIE의 xyY색 조합은 아닌듯 하고, CIE 색도표에서 SRGB로 표시 가능한 색상만 모아서 뭔가 제가 모르는 색상표를 만든듯 한데요... 변환 방법을 모르겠네요..
:
: 혹시 아신다면 살짝 알려 주시면 고맙겠습니다.
:
:
: API가 없다면, 변환 공식이나 행렬값이라도.... ^^
|