C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[53841] Re:API - 윈도우 색변환 방법에 대해서...
방태윤 [nabty] 1567 읽음    2008-07-04 11:46
//---------------------------------------------------------------------------
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가 없다면, 변환 공식이나 행렬값이라도.... ^^

+ -

관련 글 리스트
53839 API - 윈도우 색변환 방법에 대해서... 보리 1853 2008/07/04
53841     Re:API - 윈도우 색변환 방법에 대해서... 방태윤 1567 2008/07/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.