GDI+ 소개
GDIPlus는
닷넷의 그래픽 출력 엔진이다. 20년전에 C함수들로 설계된 GDI와는 다르게 C++클래스로 설계되었으며 XP이후에는 기본
출력엔진 역활을 한다. DLL파일 하나로 구성되어 있으며 C++컴파일러에서도 사용할 수 있어 C++사용자들은 GDI만으론
부족했던 부분을 GDI+를 사용으로 해결할 수 있게 되었다. (VC6사용자는
플랫폼 SDK설치를 하면 사용가능)
C#에서는 GDI+기본 클래스의 내용에 몇가지를 더하고 C#의 특성을 살려 C++보다는 좀더 편하게 사용할 수 있지만 다양한 그래픽 포맷으로 인해 외부 라이브러리를 찾아쓰던 VC사용자들에겐 적극 추천할 만한 라이브러리이다.
참고로 C#의 구조를 GTK#으로 구현하여 오픈소스화고 있는
Mono프로젝트에서의 그래픽 엔진은 윈도우에선 GDIPlus를 사용하고 Linux등에선 자체 GDIPlus같은 엔진을 만들어 사용하고 있다.
C#을 사용해 보신분이라면 Mono를 사용해 한번쯤 리눅스 프로그래밍을 해보는것도 좋은 경험이라 생각한다. 참고 Mono의 System.Drawing.
GDI+ - MSDN
GDI+ 사용하기
VC에서 사용하기 위해선 GDIPlus초기화 과정이 필요하다. 아래 소스로 헤더파일 선언과 GDI+초기화 과정을 간단하게 정리했으며
CGdiPlusStarter
g_gps;를 위치와 상관없이 전역변수로 선언해놓으면 초기화와 해제과정을 자동으로 처리해준다. 배포시는 gdiplus.dll을 같은 폴더에 포함하기만 하면 95/98에서도 문제없이 사용할 수 있다.
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus")
class CGdiPlusStarter
{
private:
ULONG_PTR m_gpToken;
public:
bool m_bSuccess;
CGdiPlusStarter() {
GdiplusStartupInput gpsi;
m_bSuccess=(GdiplusStartup(&m_gpToken,&gpsi,NULL) == Ok);
}
~CGdiPlusStarter() {
GdiplusShutdown(m_gpToken);
}
};
CGdiPlusStarter g_gps;
참고사이트
CodeProject GDI+
->
General Graphics 섹션에도 GDI+사용 예제가 많다.
In Memory Image Compression
초보자를 위한 GDI+이미지 변환, DLL에서 클래스 익스포트 예제/라이브러리
-> GDI+이미지 변환 및 wstring & string 변환, dll과 static라이브러리를 같은 소스로 만드는 방법, 스마트 포인터와 관련된 VC++의 COM Support 등의 내용을 담고 있는 예제.
GDI+ 요점
GDI+는 유니코드를 사용한다.
Status 열거형 (2. 나 참고)
GDI+의 모든 함수들은 Status 열거형으로 실행 결과를 리턴한다. 생성자로 로딩하는 Image 클래스의 에러 코드는 최후의 실패한 에러 코드를 리턴하는
GetLastStatus 함수를 사용하자.
GdiPlusEnums.h 참고.
Rect (2. 다 참고)
GDI의 RECT 구조체는 LTRB 형식으로 좌상단, 우하단
좌표로 영역을 지정하지만 GDI+ Rect 클래스는 X, Y 좌상단 좌표와 폭, 높이인 Width, Height를 멤버로 가진다. 그래서 똑같은
(10,20)-(150,100)의 영역을 표현하는 방식이 다르다.
Color (3. 가 참고)
GDI+는 색상을 Color 클래스로 표현한다. Color 클래스는 32비트의
정수로 색상을 관리하는데 8비트씩 잘라 A,R,G,B 요소를 표현한다. R,G,B는 각각 빨간색, 초록색, 파란색의 강도를 지정하며 A는 불투명도인
알파를 지정한다. 알파가 0이면 완전히 투명해서 보이지 않는 상태이며 255이면 불투명한 상태이다.
표준색상 - Color.Blue는 C#의 프로퍼티
Color Blue(0,0,255);
Pen P(Blue);
G.DrawEllipse(&P,10,10,100,100);
위 코드를 줄이면
G.DrawEllipse(&Pen(Color(0,0,255)),10,10,100,100);
처럼 만들수 있으나 C#으론
G.DrawEllipse(Pens.Blue,10,10,100,100);
이렇게 끝낼 수 있다. C#의 문법을 이용해서 몇가지 편리한 클래스가 제공되는데 아쉽게도 C++에서 따라하기엔 저렇게 간결한 문장을 만들긴 어려운 편이다.