Notice»

Recent Post»

Recent Comment»

Recent Trackback»

Archive»

« 2024/12 »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

 

'CImage'에 해당되는 글 1

  1. 2009.07.23 GDI+ (& CImage)
 

GDI+ (& CImage)

프로그래밍/영상, 음성 | 2009. 7. 23. 10:24 | Posted by 99%
http://www.winapi.co.kr/project/library/gdiplus/gdiplus.htm
아래내용은 김상형님의 WinApi사이트 내용을 정리한것이다. GDI+는 다른 책도 봤지만 김상형님 강좌만한게 없다.
GpExam2008.zip(4.8MB)



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+ 속도

.Net이 속도로 인해 GDIPlus라는 C++클래스 라이브러리를 만들었지만 GDI와 비교하면 확실히 속도는 떨어진다. 하지만 GDI+의 이미지 처리 클래스라던가 반투명 출력등의 기능은 GDI에는 없는 기능이고 이미지 출력같은 경우는 속도차이가 많이 나지 않는다. 그러므로 출력 품질을 위해서라도 GDI와의 연동하는 법을 배워 필요한곳에 적절히 사용하도록 하자.
아래에 GDI와 MFC, GDI+의 그래픽 처리 예제를 첨부했으며 예제를 실행해보면 시스템에따라 5~10배정도의 차이가 나고 출력부분을 반투명 처리할 경우는 700배정도의 차이가 난다.(위설명은 winapi사이트에 있는 그대로인데 필자의 시스템에선 GDI와 GDI의 차이가 2배 밖에 나지 않았다.)

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++에서 따라하기엔 저렇게 간결한 문장을 만들긴 어려운 편이다.

이상이 Winapi사이트 '3.나' 까지의 정리이다.




CImage

VC.Net 툴이상(VC 7.0)을 사용하면 "atlimage.h"안에 CImage라는 기본클래스가 존재하며 여러가지 기본포맷을 CBitmap으로 간단하게 가져올 수 있다. 이 클래스는 GDIPlus를 Wrapping한 클래스이며 클래스안에 CInitGDIPlus라는 GDIPlus초기화 클래스로 CImage의 Load함수만 호출하면 내부에서 CGdiPlusStarter 클래스와 같은 일을 자동으로 처리해준다.

CImage(MSDN)

사용예제(MSDN)

사실 위 예제도 필요없으며 아래 처럼 7.0이상이면 헤더파일 선언만으로 간단히 사용가능하며 배포시에도 gdiplus만 사용할때와 같다.
#include "atlimage.h"

// Load
CImage imgae;
imgae.Load(_T("C:\\1.jpg"));

// Draw
CClientDC dc(this);
imgae.Draw(dc,0,0,100,100);

// CBitmap으로 가져오기
CBitmap* pBitmap = CBitmap::FromHandle(image.Detach());
Image클래스처럼 유니코드를 사용할 필요도 없으며 간단히 사용가능 하지만 하나를 배우면 주의사항 또한 늘어나는 법이다.

이전 운영 체제에서 CImage 제한(MSDN)
http://msdn.microsoft.com/ko-kr/library/cc468120(VS.71).aspx

'프로그래밍 > 영상, 음성' 카테고리의 다른 글

OpenCV(ComputerVision) 기본편  (1) 2009.08.19
CxImage  (0) 2009.08.19
영상처리 관련 조언, 책들...  (0) 2009.07.20
IJL(Intel Jpeg Library)  (1) 2009.04.16
: