// BYTE, WORD, DWORD, COLORREF형과 RGB() 함수가 정의되어 있지 않다면
// 다음처럼 정의하라. 정의되어 있지 않으면 컴파일 에러가 발생한다.
// 다음처럼 정의하라. 정의되어 있지 않으면 컴파일 에러가 발생한다.
/* ------------------------------------------------------------------------------------------
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
typedef DWORD COLORREF;
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))
끝! ^_^;;
다음검색