본문으로 바로가기

HSB(HSV) 값을 RGB로 변경하는 공식

category 개발언어/c++ 2016. 6. 13. 16:38

색상(Color)색상표(Color Picker) HSB(HSV) 값을 RGB로 변경하는 공식

RGB로의 색상 변경이야 기본적으로 작업하기 쉽지만

HSB로의 색상 변경의 경우는 공식을 알아도 약간 까다로울 있습니다.
다음의 내용은 HSB 이용하여 RGB 색상을 찾아내는 방법이다
.

색상표를 작성하여 해당 값으로 변경해 주기 위해서는 기본적으로 해당 색상표의 특징을 알아야만 가능하다
.
RGB 색상의 경우 기본적으로 기본적으로 Red(0~255), Green(0~255), Blue(0~255) 각각 256 개의 색상으로 이들을 배합하면  16777216가지 색상의 표현이 가능해진다
.
 

 RGB 색상표
HSB 색상은 Hue(0~360)으로 0 360 동일한 값을 갖기 때문에 360가지 색상을 갖고
,
Saturation(0~101)
101한가지의 채도, Bright(0~101) 101가지의 명도 3672360 색상을 갖지만
,
일부 색상이 중복된다는 점을 생각 한다면 이보다 적은 색상밖에 표현하지 못하게 된다
.
 

 HSB 색상표

아래 이미지는 Hue 값을 나타내는 도표이다.


 
RED
범위는 241˚~360˚, 0˚~119˚ 구간으로 360˚ 에서 최대값을 갖는다.
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 값이다
.