CAFE

C++

RGB와 CMYK 값을 상호변환하기

작성자알치|작성시간04.09.07|조회수1,178 목록 댓글 0
 
 
// BYTE, WORD, DWORD, COLORREF형과 RGB() 함수가 정의되어 있지 않다면
// 다음처럼 정의하라. 정의되어 있지 않으면 컴파일 에러가 발생한다.
/* ------------------------------------------------------------------------------------------
typedef unsigned char BYTE;
typedef unsigned int  WORD;
typedef unsigned long DWORD;
typedef DWORD COLORREF;
 
#define RGB(r,g,b)   ((COLORREF)(((BYTE)(r) | ((WORD)((BYTE)(g))<<8)) | (((DWORD)(BYTE)(b))<<16)))
----------------------------------------------------------------------------------------------*/
 

 
///////////////////////////////////////////////////////////////////////////////
// RGB2CMYK()는 RGB -> CMYK 값 변환 함수
///////////////////////////////////////////////////////////////////////////////
 
void RGB2CMYK(BYTE r, BYTE g, BYTE b, BYTE& c, BYTE& m, BYTE& y, BYTE& k)
{
    double C, M, Y, K;
    double R, G, B;
 
    R = (double) r;
    G = (double) g;
    B = (double) b;
 
    R = 1.0 - (R / 255.0);
    G = 1.0 - (G / 255.0);
    B = 1.0 - (B / 255.0);
 
    if (R < G)
        K = R;
    else
        K = G;
 
   if (B < K)
        K = B;
 
    C = (R - K)/(1.0 - K);
    M = (G - K)/(1.0 - K);
    Y = (B - K)/(1.0 - K);
 
    C = (C * 100) + 0.5;
    M = (M * 100) + 0.5;
    Y = (Y * 100) + 0.5;
    K = (K * 100) + 0.5;
 
    c = (BYTE) C;
    m = (BYTE) M;
    y = (BYTE) Y;
    k = (BYTE) K;
}
 
 
///////////////////////////////////////////////////////////////////////////////
// CCMYK2RGB()는 CMYK ->  RGB 값 변환 함수
///////////////////////////////////////////////////////////////////////////////
 
COLORREF CMYK2RGB(BYTE c, BYTE m, BYTE y, BYTE k)
{
    BYTE r, g, b;
    COLORREF rgb;
    double R, G, B;
    double C, M, Y, K;
 
    C = (double) c;
    M = (double) m;
    Y = (double) y;
    K = (double) k;
 
    C = C / 255.0;
    M = M / 255.0;
    Y = Y / 255.0;
    K = K / 255.0;
 
    R = C * (1.0 - K) + K;
    G = M * (1.0 - K) + K;
    B = Y * (1.0 - K) + K;
 
    R = (1.0 - R) * 255.0 + 0.5;
    G = (1.0 - G) * 255.0 + 0.5;
    B = (1.0 - B) * 255.0 + 0.5;
 
    r = (BYTE) R;
    g = (BYTE) G;
    b = (BYTE) B;
 
    rgb = RGB(r,g,b);
 
    return rgb;
}
 

 
다음은 http://www.winapi.co.kr 사이트에 있는 윈도우즈 색상에 대한 내용이다.
RGB나 색상 개념이 없는 분을 위해 소개한다.
 
 
윈도우즈에서 색상을 표현하는 방법에 대해 알아보자.
도스에서는 WHITE, YELLOW, RED 등의 매크로 상수로 색상을 표현했고
이 매크로들의 실제값은 0~15까지의 정수였다.
도스에서야 기껏 16색상까지 사용할 수 있었으므로 각 색상마다 이름을 줄 수 있었지만
최대 천육백만가지 색상을 사용할 수 있는 윈도우즈 환경에서는 이런 간단한 방법을 쓸 수 없다.
윈도우즈에서는 색상값을 표현하기 위해 COLORREF라는 데이터형을 사용하는데
이는 다음과 같이 정의되어 있다.
typedef DWORD COLORREF;

보다시피 COLORREF 형은 부호없는 32비트 크기의 정수형이며

8비트씩 빨간색, 초록색, 파란색의 농도를 나타내며 상위 8비트는 사용되지 않는다.

각 색상 요소는 1바이트의 크기를 가지므로 0~255까지의 농도를 표현할 수 있다.

COLORREF형은 32비트 정수일 뿐이므로 직접 16진수로 표현할 수도 있다.

예를 들어 0는 검정색이 되며 0xff는 빨간색, 0xff0000은 파란색이 된다.

하지만 이 방법은 너무 기계적이고 초보자가 쓰기는 힘들므로

색상값을 만들 때는 통상 RGB 매크로 함수를 사용하며 이 매크로는 다음과 같이 정의되어 있다.

#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) | ((WORD)((BYTE)(g))<<8)) | (((DWORD)(BYTE)(b))<<16)))

RGB() 매크로 함수는 세 개의 인수를 가지는데 각각 빨간색, 초록색, 파란색의 농도이며

이 세값을 조립하여 하나의 32비트 색상값을 만들어내는 간단한 비트 연산을 하고 있다.

비트 쉬프트, 비트 OR 연산자를 적절히 혼합한 문장인데 그리 어렵지 않게 이해가 될 것이다.

각 색상 요소가 얼마만큼 혼합되어 있는가에 따라 실제 색상이 결정되는데

RGB(255,0,0)는 빨간색, RGB(0,0,255)는 파란색이다.

세 요소가 모두 다 최대치인 RGB(255,255,255)는 흰색이며

반대로 RGB(0,0,0)는 검정색이다.

윈도우즈에서는 이와같이 RGB 매크로를 사용하여 색상값을 표현하며

COLORREF 형의 인수 자리에는 RGB 매크로를 사용하면 된다.

다음 세 매크로 함수는 COLORREF 형 변수값에서 각 색상요소의 농도를 분리해내는 함수이다.

#define GetRValue(rgb)      ((BYTE)(rgb))
#define GetGValue(rgb)      ((BYTE)(((WORD)(rgb)) >> 8))
#define GetBValue(rgb)      ((BYTE)((rgb)>>16))


 
끝! ^_^;;
다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼