2014년 10월 27일 월요일

CxImage 유니코드 빌드...

우선 CxImage 라이브러리 사용방법부터...
cximage599c_full_unicode.7z

압축을 풀어 메인프로젝트를 불러온다.
필요한 라이브러리만 빌드하면 되는데, 우선 ximacfg.h 이 파일을 열면 아래와 같은 내용이 보인다.

/////////////////////////////////////////////////////////////////////////////
// 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_MNG 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_J2K 0  // Beta, use JP2
#define CXIMAGE_SUPPORT_JBG 0  // GPL'd see ../jbig/copying.txt & ../jbig/patents.htm

#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

CxImage 라이브러리가 지원할 파일 포멧을 설정할 곳인데, 필요한 파일포멧만 1로 만들어주면 된다.

이렇게 세팅해주고, CxImage 프로젝트만 빌드한다.

그 다음 필요한 파일포멧 라이브러리를 빌드하면 된다. 위에서는 JPG 포멧을 설정했으므로, JPG프로젝트만 빌드한다. 그러면 lib파일이 두개가 생길 것이다.

이 두개와 cximage 폴더에 있는 헤더파일을 현재 작업중인 프로젝트에 복사한다.(뭐 따로 폴더를 만들어서 하던지 말던지...)

그 다음 위 헤더파일이 있는 폴더를, 프로젝트 속성에서 추가해주거나, 헤더파일의 경로를 직접 입력해서 인클루드 시켜주자.

#include "ximage.h"

그리고 라이브러리 링크

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

이런식으로...

그리고 아래처럼 사용하면 된다. (BMP를 JPG로 변환)

    CxImage cimage;
    HBITMAP m_bitmap = NULL;
    cimage.Load(sResultBMP, CXIMAGE_FORMAT_BMP);
    if (cimage.IsValid())
{
     if(!cimage.IsGrayScale()) cimage.IncreaseBpp(24);
     cimage.SetJpegQuality(99);
     CString sResultJPG = sResultFile + _T(".jpg");
     cimage.Save(sResultJPG,CXIMAGE_FORMAT_JPG);
}

근데...CxImage 홈페이지(http://www.xdp.it)의 최신버전(현재 6.0)을 유니코드로 빌드하고, 사용하면...안된다-_-; Load와 Save의 인자가 틀리다고 나오는데...왜 그러는지 모르겠으나, 인터넷에서 이런 글을 찾았다.

===============================================================================================================
VS2005 에서 링크에러가 발생하지요?
그 이유는 VS.net 의 경우 기본 문자코드가 유니코드이기 때문입니다.
VC++6.0 에서도 유니코드 컴파일을 하게 되면 역시나 같은 문제가 발생합니다.

이유는 간단합니다.
ximage.h 파일에 정의된 Save, Load 의 파일명의 인자가 const char* 가 아니라 const TCHAR* 이기 때문입니다.

즉, 유니코드 컴파일을 하게 되면 TCHAR 가 자연히 wchar_t 로 변경되게 됩니다.
하지만, CxImage 의 라이브러리들은 이미 Ansi 코드로 컴파일 되었기 때문에 wchar_t를 받아들일 수 없는 것입니다.

즉 함수 선언은 wchar_t 로 되어있는데, 함수 본체에서는 char 를 사용하고 있기에 링크 에러가 발생하는 것이지요.

그런 점에서 CxImage 개발자들이 중요한 점을 간과한 것 같습니다. TCHAR를 사용해서 유니코드에서도 범용적으로
사용될 수 있기 위해서는 유니코드 컴파일로 라이브러리가 만들어져야 하지만, 실제로 유니코드 컴파일을 해보니
에러가 나기 때문입니다.

따라서 해결책은 간단합니다.

ximage.h 를 열어서 Save 와 Load 를 찾은 후에 TCHAR 를 char 로 변경하시기 바랍니다.
아마도 5.99 소스라면 이미 char 가 주석처리 되어있기에 주석을 풀고 TCHAR를 주석처리하면 될 것입니다.

유니코드로 프로그램을 작성하신다면 부득이하게 파일명을 넘길 때, char* 로 변경해서 넣어줘야 합니다.
WideCharToMultiByte 함수를 사용하면 간단히 해결됩니다.
=================================================================================================================

그래서 맨 위에서 5.99의 unicode 정식지원 버전을 링크했다. 이녀석으로 하니까 잘 되긴 한다.

난 아직도 저글을 이해못하겠다...왜 안된다는거야-_-;그리고 왜 에러나는거야;;

댓글 없음: