본문 바로가기

Visual C++/CxImage, VC++ Setup

CxImage, with VC++ 2012

Visual C 2012에서 CxImage 7.0.1 을 사용하기 위한 설정


테스트 환경

  - Windows 7

  - Visual C 2012

  - CxImage 7.0.1


CxImage 영상처리 라이브러리 소개 참조

  - About CxImage in CodeProject


CxImage Download

  - CxImage 7.0.1 라이브러리 소스코드 다운로드 http://www.xdp.it/download.htm


CxImage 7.0.1 소스 폴더구조


다운로드한 압축파일을 압축해제하면 오른족과 같은 구조의 폴더 안에 소스코드가 저장되어 있는 것을 확인할 수 있다

이들 폴더 한개는 각각의 프로젝트 구성 파일이기 때문에 많은 프로젝트가 존재하며 필요한 프로젝트만 빌드하여 정적 라이브러리(*.lib) 를 생성하여 원하는 프로젝트에 사용하면 된다. 각 폴더에는 소스파일(*.cpp)과 헤더파일(*.h)이 저장되어 있다.


CxImage 폴더는 영상처리와 관련하여 기본적으로 필요한 기능이 구현된 프로젝트이고,

jpeg 폴더는 jpeg 이미지 파일를 다루기위한 기능을 가진 프로젝트라고 생각하면 된다


모든 프로젝트틀이 항상 필요한 것을 아니고 개발자가 구현해야 하는 기능에 따라서 필요한 것만 선택하여 빌드하고 각자의 프로젝트에 활용하면 된다.


여기서 다루는 내용은 Visual C 2012, CxImage 7.0.1을 이용하여 최종적으로 JPEG 파일을 화면에 출력하는 내용이다.


CxImage 라이브러리(cximage.lib)를 사용하기까지의 절차


1. 소스코드(7.0.1) 다운로드 및 압축해제

  - 다운로드,  http://www.xdp.it/download.htm

  - 압축해제 : 오른쪽과 같은 폴더구조 확인


2. CxImage폴더 내에서 cximage.vcproj 파일을 찾아서 VC 2012에서 열기

  - CxImage 폴더 안에서 VC++ Project 파일을 확인하고 VC++2012를 이용하여 연다

  - 열고자 하는 프로젝트 파일이 VC 2012 보다 하위 버전에서 생성된 것이므로 현재버전으로 변환하는 것에 동의해야 한다.

  - 프로젝트가 성공적으로 열리면 다음과 같이 프로젝트를 설정한다


3. CxImage 프로젝트 설정

  - cximage 프로젝트 위에서 마우스 우측을 누르고 Prppertiers항목을 선택하여 다음과 같이 설정한다




4. CxImage프로젝트 런타임 라이브러리 선택

 - 아래 그림과 같이 CxImage 프로젝트를 Release 모드에서 Multi-Threaded(/MT) 로 설정하고 라이브러리를 빌드했다면 이 라이브러리를 사용하는 프로젝트가 Debug 모드일 경우에 Multi-Threaded debug(/MTd) 으로 설정하여 테스트하고 Release일 경우에는Multi-Threaded(/MT)으로 설정해야 오류가 발생하지 않았다



ximacfg.h 파일 편집

CxImage 폴더에 있는 ximacfg.h 파일을 수정하여 꼭 필요한 기능만 포함될 수 있도록 필요한 이미지 포맷을 1으로 설정해주고 나머지는 0으로 설정한다

/////////////////////////////////////////////////////////////////////////////

// CxImage supported formats

#define CXIMAGE_SUPPORT_BMP 1

#define CXIMAGE_SUPPORT_GIF 0

#define CXIMAGE_SUPPORT_JPG 1

#define CXIMAGE_SUPPORT_PNG 0

#define CXIMAGE_SUPPORT_ICO 0

#define CXIMAGE_SUPPORT_TIF 0

#define CXIMAGE_SUPPORT_TGA 0

#define CXIMAGE_SUPPORT_PCX 0

#define CXIMAGE_SUPPORT_WBMP 0

#define CXIMAGE_SUPPORT_WMF 0


#define CXIMAGE_SUPPORT_JP2 0

#define CXIMAGE_SUPPORT_JPC 0

#define CXIMAGE_SUPPORT_PGX 0

#define CXIMAGE_SUPPORT_PNM 0

#define CXIMAGE_SUPPORT_RAS 0


#define CXIMAGE_SUPPORT_JBG 0 // GPL'd see ../jbig/copying.txt & ../jbig/patents.htm


#define CXIMAGE_SUPPORT_MNG 0

#define CXIMAGE_SUPPORT_SKA 0

#define CXIMAGE_SUPPORT_RAW 0

#define CXIMAGE_SUPPORT_PSD 0


////////////////////////////////////



ximage.h 헤더파일에서 확인할 내용

CxImage 소스폴더에 있는  ximage.h 헤더파일의 내용 중에서 유니코드를 지원하기 위한 함수들이 제대로 설정되어 있는지 확인한다

여기서는 유니코드를 사용할 것이므로 아래처럼 유니코드를 지원하는 함수가 주석 없이 활성화되어 있어야 한다.

유니코드를 사용한다고 했으면 당연하게도 MBCS 를 지원하는 다른 함수는 아래처럼 주석으로 처리해야 한다.

#if CXIMAGE_SUPPORT_DECODE

/** \addtogroup Decode */ //@{

#ifdef WIN32

//bool Load(LPCWSTR filename, uint32_t imagetype=0);

bool LoadResource(HRSRC hRes, uint32_t imagetype, HMODULE hModule=NULL);

#endif

// For UNICODE support: char -> TCHAR

bool Load(const TCHAR* filename, uint32_t imagetype=0);

//bool Load(const char * filename, uint32_t imagetype=0);

bool Decode(FILE * hFile, uint32_t imagetype);

bool Decode(CxFile * hFile, uint32_t imagetype);

bool Decode(uint8_t * buffer, uint32_t size, uint32_t imagetype);


bool CheckFormat(CxFile * hFile, uint32_t imagetype = 0);

bool CheckFormat(uint8_t * buffer, uint32_t size, uint32_t imagetype = 0);

//@}

#endif //CXIMAGE_SUPPORT_DECODE

#if CXIMAGE_SUPPORT_ENCODE

protected:

/** \addtogroup Protected */ //@{

bool EncodeSafeCheck(CxFile *hFile);

//@}


public:

/** \addtogroup Encode */ //@{

#ifdef WIN32

//bool Save(LPCWSTR filename, uint32_t imagetype=0);

#endif

// For UNICODE support: char -> TCHAR

bool Save(const TCHAR* filename, uint32_t imagetype);

//bool Save(const char * filename, uint32_t imagetype=0);

bool Encode(FILE * hFile, uint32_t imagetype);

bool Encode(CxFile * hFile, uint32_t imagetype);

bool Encode(CxFile * hFile, CxImage ** pImages, int32_t pagecount, uint32_t imagetype);

bool Encode(FILE *hFile, CxImage ** pImages, int32_t pagecount, uint32_t imagetype);

bool Encode(uint8_t * &buffer, int32_t &size, uint32_t imagetype);


bool Encode2RGBA(CxFile *hFile, bool bFlipY = false);

bool Encode2RGBA(uint8_t * &buffer, int32_t &size, bool bFlipY = false);

//@}

#endif //CXIMAGE_SUPPORT_ENCODE


5. CxImage 프로젝트 빌드

  - CxImage 프로젝트 위에 마우스 우측을 누르고 Project Only > Build Only cximage 선택


6. 빌드결과 cximage.lib 파일 생성 확인

  - CxImage 소프폴더 안에 Unicode Release 폴더 안에 cximage.lib 파일이 생성되어 있는지 확인한다

  - 위와같이 편집된 헤더파일은 라이브러리 빌드할 때 사용할 뿐만 아니라 라이브러리를 다른 프로젝트에서 사용할 때도 반드시 사용해야 한다


7.. jpeg 폴더 내에서 Jpeg.vcproj 파일을 찾아서 VC 2012에서 열고 설정 및 빌드

  - 위에서 생성한 CxImage 프로젝트가 속한 솔루션에서 마우스 우측을 눌러 jpeg 소스폴더에 있는 Jpeg.vcproj 파일을 연다

  - CxImage와 마찬가지로 상위버전으로 변환하는 것에 동의한다.

  - Jpeg 프로젝트가 VC 2012 솔루션에 열리면 CxImage 프로젝트와 동일하게 설정하고 빌드한다

  - jpeg 폴더 안에 Jpeg.lib 파일이 생성되어 있는지 확인한다



Windows 7, VC++ 2012에서 빌드된 CxImage 라이브러리, Unicode Release


Windows XP, VC++ 2010에서 빌드된 CxImage 라이브러리, Unicode Release



위의 절차를 마치면 2개의 라이브러리(cximage.lib, jpeg.lib) 가 생성되고 이제 이들 라이브러리의 기능을 이용하는 프로젝트를 생성할 차례이다


8. 위의 2개 프로젝트가 속해 있는 솔루션에 MFC 프로젝트를 생성하고 다음과 같이 설정한다

  - 프로젝트 이름은 편의상 CxImageUse 으로 한다

  - 프로젝트 위에서 마우스 우측 > Set as StartUp Project 선택







현재 설정하는 프로젝트는 위에서 생성한 2개의 라이브러리를 사용하는 메인 프로젝트이기 때문에 참조할 라이브러리의 위치와 라이브러리에 포함된 함수들의 원형이 선언된 헤더파일의 위치를 등록해야 한다

CxImage / Unicode_Release 폴더에 cximage.lib 파일이 생성되어 있고, 헤더 파일은 CxImage 폴더 안에 있기 때문에 다음과 같이 현재 프로젝트의 Include Directories항목에 헤더파일의 경로를 등록하고, Library Directories 항목에 라이브러리가 있는 폴더를 등록하면 된다




9. CxImage 라이브러리를 사용하는 코드작성

 - stdafx.h 파일에 #include "ximage.h" 을 추가한다.

 - ChildView.cpp 파일에 위에서 생성한 2개의 라이브러리를 포함하는 디렉티브 추가

    #pragma comment(lib, "cximage.lib")

    #pragma comment(lib, "jpeg.lib")

 - ChildView.cpp 파일의 OnPaint() 함수에 다음과 같은 코드를 작성한다


void CChildView::OnPaint() 

{

CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.


// TODO: 여기에 메시지 처리기 코드를 추가합니다.

/*

CxImage cimage;

        HBITMAP m_bitmap = NULL;

        cimage.Load(_T("D:\\test\\lake.jpg"), CXIMAGE_FORMAT_JPG);

        m_bitmap = cimage.MakeBitmap(dc.m_hDC);

*/


CxImage cimage

cimage.Load (_T("D:\\test\\lake.jpg"), CXIMAGE_FORMAT_JPG) ;

cimage.Draw (dc.m_hDC, 0, 0); 


// 그리기 메시지에 대해서는 CWnd::OnPaint()를 호출하지 마십시오.

}



10. CxImageUse 프로젝트 빌드

 - 프로젝트 위에서 마우스 우측 > Project Only > Build Only CxImageUse 선택


11. CxImage 라이브러리를 사용하는 프로그램 실행 및 이미지 출력 확인

 - 테스트용 이미지 준비 ( D:\\test\\lake.jpg )

 - Debug > Start Without Debugging


12. #pragma comment(lib, "cximage.lib")  디렉티브 대신에 다음과 같이 설정해도 된다




테스트용으로 사용된 이미지




화면에 출력된 이미지