※ 요약

필자가 만든 Color Picker(색상 추출) 프로그램이다. 시중에 많은 컬러 피커 프로그램들이 있고, 잘 만들어진 것도 많지만 필자가 사용할때 꼭 한 두 가지 부족한 기능들로 인해 직접 만들게 되었다. 필자가 필요한 기능 위주로 만들어서 사용자 입장에서는 더 필요한 기능이 있을 수도 있을 수 있는데, 이런 부분들은 댓글로 요청하면 가능한 선에서 추가/수정하도록 하겠다. 이 프로그램은 주로 블로그를 하면서 rgb값과 html(hex)값을 확인하기 위해 만들었다.


이 프로그램은 C++11과 마우스 후킹과 키보드 후킹 기능을 이용해서 만들었다. 마우스 후킹은 마우스의 움직임을 전역적으로 확인하려고 사용했고, 키보드 후킹은 전역 단축키(Global Hotkey) 때문에 사용했다. 제작할때 가장 힘들고 오래걸린 작업은 화면 구성인데 화면 구성에 50% 이상의 시간을 사용한거 같다. 화면 구성은 jcpicker라는 프로그램을 참고했다.


※ 개발 환경

Windows 10 x64

Visual Studio 2015 Community Update1

Unicode


Modern C++


MFC 14.0

Ado( MariaDB ODBC ver 1.0.5 )

regex


실행 환경 테스트

Windows 7 x64

Windows 10 x64


※ 다운로드

OiColorPicker_0.9.zip



※ 사용 방법

프로그램 사용법은 어렵지 않아서 몇 번 실행해보면 바로 익숙해질 것이다.

아래는 OiColorPicker를 처음 실행한 모습이다. 후킹을 사용했기때문에 프로그램만 실행하고 마우스를 움직이면 마우스 위치의 컬러 코드 값을 출력해준다.


저장하고 싶은 컬러 코드가 있으면 Alt+X키를 누르면 아래 우측 화면과 같이 컬러코드가 저장된다. 마찬가지로 후킹을 사용하였기때문에 OiColorPicker프로그램이 다른 프로그램에 가려지거나 안보여도 Alt+X키를 누르면 우측 리스트에 저장된다. 저장될때는 컬러코드와 함께 해당 컬러코드 색으로 저장되기 때문에 다시 찾아쓰기 편하다. 다시 찾아쓸때는 리스트에서 해당 아이템을 선택 후 Ctrl+C키를 누르면 해당 Hex 컬러코드 값이 복사된다. 또 Delete키도 먹힌다.


마지막으로 Converter기능인데, 화면 좌하단에 위치해있다.

rgb->hex 또는 hex->rgb 컬로 코드로 바꿔준다.


※ 버전

2016.02.11.

ver 0.9 (MD5 : 402e0bed11198576cc7618aef0ea3359) OiColorPicker 테스트 버전


'프로그래밍 관련 > 자작 프로그램' 카테고리의 다른 글

ip 확인 프로그램 - 오뇽 IP  (2) 2013.12.20
각도기 프로그램  (60) 2013.11.28
위경도 도, 도분, 도분초 변환  (19) 2013.10.17
EXIF Viewer, EXIF 뷰어  (7) 2013.10.05
Point Cloud  (0) 2013.10.02
무료 로또 프로그램 - 오뇽 로또  (393) 2013.09.13
넷마블 틀린그림찾기 매크로  (17) 2013.04.01



※요약

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

+ Recent posts