※요약
COLORREF :
-윈도우즈에서는 색상값을 표현하기 위해 COLORREF라는 데이터형을 사용
-부호없는 32비트 정수형
-R, G, B 각각 1바이트(8비트)이며 0~255 범위의 농도를 표현
RGB :
-빛의 3원색인 적, 녹, 청을 혼합하여 색을 나타내는 방식
※특징
아래 소스는 윈도우 및 리눅스에서 사용 가능하고 필요한 부분만 붙여넣고 사용하면 됩니다.
윈도우 상에서만 사용할 소스 코드라면 아래와 같이 긴 소스 코드가 필요 없고
RGB매크로와 GetRValue, GetGValue, GetBValue매크로만 사용하면 됩니다.
매크로가 있는데 굳이 함수로도 만든 이유는, 리눅스 상에서 사용할 때 편할 걸로 하기 위해서 입니다.
비트 연산이 이해가 안되면 직접 종이에 써 보면서 하면 쉽습니다.
※예제
#include <stdio.h> #ifdef WIN32 //윈도우 환경이면 windows.h를 추가(윈도우 환경이어도 컴파일 환경에 따라 WIN32가 없을 수 있음) #include <windows.h> #else //윈도우 환경이 아닐 경우 WinDef.h나 WinGDI.h에 선언, 정의된 내용 중 필요한 것들을 아래에 작성 //아래의 DWORD, WORD, BYTE, COLORREF는 WinDef.h에 선언된 내용 typedef unsigned long DWORD; typedef unsigned short WORD; typedef unsigned char BYTE; typedef DWORD COLORREF; //아래의 RGB, GetRValue, GetGValue, GetBValue는 WinGDI.h에 선언된 내용 #ifndef RGB #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) #endif #ifndef GetRValue //GetRValue가 선언되어 있지 않다면 #define GetRValue(rgb) ( (BYTE)(rgb) ) ⁄⁄GetRValue를 내가 선언 #endif #ifndef GetGValue #define GetGValue(rgb) ( (BYTE)(((WORD)(rgb))>>8) ) #endif #ifndef GetBValue #define GetBValue(rgb) ( (BYTE)((rgb)>>16) ) #endif #endif //아래 3개의 함수들은 int대신 BYTE형으로 내부 처리 및 반환을 해도 상관없지만 //32비트 CPU의 기본 처리 단위는 4byte이므로 int형으로 처리하는 게 더 낫다. int REF2R( COLORREF rgb ); int REF2G( COLORREF rgb ); int REF2B( COLORREF rgb ); int main( ) { DWORD dwTemp = RGB( 56, 128, 108 ); int nR1 = REF2R( dwTemp ); int nG1 = REF2G( dwTemp ); BYTE nB1 = BYTE( REF2B(dwTemp) ); //int형을 반환하지만, 반환하는 값의 범위가 BYTE형 범주이므로 상관없음 //int로 받아도 되고 BYTE로 받아도 된다. BYTE nR2 = GetRValue( dwTemp ); BYTE nG2 = GetGValue( dwTemp ); BYTE nB2 = GetBValue( dwTemp ); printf( "R:%d, G:%d, B:%d\n", nR1, nG1, nB1 ); printf( "R:%d, G:%d, B:%d\n", nR2, nG2, nB2 ); return 0; } int REF2R( COLORREF rgb ) { int nBitmaskRed = 0x0000ff; //255 int nRed = rgb & nBitmaskRed; return nRed; } int REF2G( COLORREF rgb ) { int nBitmaskGreen = 0x00ff00; //65280 int nGreen = ( rgb & nBitmaskGreen ) >> 8; return nGreen; } int REF2B( COLORREF rgb ) { int nBitmaskBlue = 0xff0000; //16711680 int nBlue = ( rgb & nBitmaskBlue ) >> 16; return nBlue; }
※결과
'C > 기타' 카테고리의 다른 글
[C언어] 콘솔 창에서 컬러 텍스트 출력 (0) | 2013.11.28 |
---|