색상(Color)색상표(Color Picker) HSB(HSV) 값을 RGB로 변경하는 공식
RGB로의 색상 변경이야 기본적으로 작업하기 쉽지만
HSB로의 색상 변경의 경우는 공식을 알아도 약간 까다로울 수 있습니다.
다음의 내용은 HSB를 이용하여 RGB 색상을 찾아내는 방법이다.
색상표를 작성하여 해당 값으로 변경해 주기 위해서는 기본적으로 해당 색상표의 특징을 알아야만 가능하다.
RGB 색상의 경우 기본적으로 기본적으로 Red(0~255), Green(0~255), Blue(0~255) 각각 256 개의 색상으로 이들을 배합하면 총 16777216가지 색상의 표현이 가능해진다.
HSB 색상은 Hue(0~360)으로 0과 360이 동일한 값을 갖기 때문에 360가지 색상을 갖고,
Saturation(0~101) 총 101한가지의 채도, Bright(0~101) 총 101가지의 명도 총 3672360의 색상을 갖지만,
일부 색상이 중복된다는 점을 생각 한다면 이보다 더 적은 색상밖에 표현하지 못하게 된다.
HSB 색상표
아래 이미지는 Hue 값을 나타내는 도표이다.
RED의 범위는 241˚~360˚, 0˚~119˚ 구간으로 360˚와 0˚에서 최대값을 갖는다.
Green이 포함되어 있는 구간은 1˚~239˚ 구간으로 120˚에서 최대값을 갖는다.
Blue가 포함된 구간은 121˚~359˚로 240˚에서 최대값을 갖는다.
이외의 값들은 최고값에서 멀어질수록 해당 색상의 비율은 적어지게 된다.
이 값을 찾는 방법은 매우 단순하다.
Hue값 구하는 공식
i=((m_hue%60)/60.00)*255; //i의 범위는 0 ~ 255 까지이다. 소수점 단위까지 입력 하여야 제대로 된 계산을 하게된다.(결과값은 정수)
if((m_hue>=0 && m_hue<=60 )||( m_hue>=300 && m_hue<=360)) // Red 값이 255로 고정된 부분(Magenta~Yellow)
m_cr=255;
else if(m_hue>60 && m_hue<120) // Red 값이 감소하는 위치 (Yellow ~ Green)
m_cr=255-i;
else if(m_hue>240 && m_hue<300) // Red 값이 상승하는 위치 (Blue ~ Magenta)
m_cr=i;
else
m_cr=0;
if(m_hue>=60 && m_hue<=180) // Green 값이 고장되어 있는 위치 (Yellow ~ Cyan)
m_cg=255;
else if(m_hue>180 && m_hue<240) // Green값이 감소하는 위치 (Cyan ~ Blue)
m_cg=255-i;
else if(m_hue>0 && m_hue<60) // Green값이 상승하는 위치 (Red ~ Yellow)
m_cg=i;
else
m_cg=0;
if(m_hue>=180 && m_hue<=300 ) // Blue 값이 고정되어 있는 위치 (Cyan ~ Magenta)
m_cb=255;
else if(m_hue>300 && m_hue<360) // Blue 값이 감소하는 위치 (Magenta ~ Red)
m_cb=255-i;
else if(m_hue>120 && m_hue<180) // Blue 값이 상승하는 위치 (Green ~ Cyan)
m_cb=i;
else
m_cb=0;
Saturation(채도)의 경우 색상의 배합 비율을 말한다.
채도가 클수록 본래의 색상에 가깝게 되며 작을수록 회색계열(흰색, 검정 포함)이 된다.
위 이미지는 명도와 채도를 나타내는 이미지로 공식은 단순하다.
채도가 높으면 채도값에 해당되는 값을 비율로 환산하여 추가하여 준다.
Saturation 구하는 공식
sr=m_cr+(255-m_cr)*(100-m_sat)/100.00; // Saturation 값을 받아서 색상에 적용한다.
sg=m_cg+(255-m_cg)*(100-m_sat)/100.00;
sb=m_cb+(255-m_cb)*(100-m_sat)/100.00;
Bright(명도)의 경우 가장 낮은값과도 관련 있다.
Hue와 Saturation에서 받아온 값에 Bright 값을 백분율로 환산하여 곱해주면 된다.
Bright 구하는 공식
m_red=sr*m_brt/100; // bright 값을 받아서 색상에 적용한다.
m_green=sg*m_brt/100;
m_blue=sb*m_brt/100;
여기에서 m_hue 값은 Hue 값을 받아온 상수이며, m_sat 값은 Saturation, m_brt 값은 Bright 값이다.
'개발언어 > c++' 카테고리의 다른 글
Event Driven Programming using Template Specializations in C++ (0) | 2016.07.09 |
---|---|
시스템 아이콘 Merge 시켜 사용하기 (0) | 2016.06.13 |
RGB to HSV and HSV to RGB (1) | 2016.06.13 |
함수 포인트, Function Point, 동적 함수호출,임의의 함수 호출 (0) | 2016.06.13 |
Visual Studio Release 모드에서 디버깅 (0) | 2016.06.13 |