윈도우즈 프로그래밍을 접하고 사용하다 보면 BMP(Bitmap)를 기본 리소스로 두고 사용하게 되어 있습니다. 그러나 BMP파일은 파일을 분석하기 쉬운 반면 압축이 되지 않아 용량이 무겁기 때문에, 압축 알고리즘이 적용된 GIF(Graphic Interace Format)나 JPEG(Joint Photographic coding Expert Group)형식을 선호하게 됩니다.

 이 때 API(Application Programming Interface)나 MFC(Microsoft Foundation Class library)를 통해 BMP형식 이외의 이미지를 보여주는 작업을 하고자 한다면 외부 그래픽라이브러리를 사용하여 파일을 읽어들어야 합니다. libpng나 CxImage가 대표적인 오픈소스(Opensource)인데 이 게시물에서는 그 중 CxImage를 이용한 MFC에서의 간단한 파일 출력을 함께 해보겠습니다. :)


 Step 1. CxImage 라이브러리 다운로드
 먼저 아래의 주소를 통해 CxImage 라이브러리를 다운로드 받습니다. 2009년 4월 19일 현재 CxImage 6.00 버전이 최신 버전입니다.
http://www.codeproject.com/KB/graphics/cximage.aspx    // 다운로드 링크. Sourceforge 회원에 가입해야 한다.


 Step 2. 라이브러리 컴파일
 다운로드 한 라이브러리를 적당한 위치에 압축을 푼 후, CxImgLib 솔루션을 열면 13개의 프로젝트가 포함된 거대한 솔루션이 열립니다. 그 중 CxImage프로젝트에 있는 ximacfg.h 를 열어 자신이 사용하고자 하는 이미지 포맷을 선택할 수 있습니다. 만약 사용하지 않는 이미지 포맷을 제거 한다면 Lib파일이 좀 더 가벼워집니다.

그림 1. CxImage 에서 지원하는 이미지 포맷. 1로 두면 해당 포맷을 지원하고 0으로 두면 지원하지 않게 된다.


원하는 이미지 포맷을 선택했다면, 원하는 프로젝트 선택해서 빌드를 합니다. (단, png포맷은 반드시 zlib와 같이 빌드 되어야 합니다.)


 Step 3. 생성된 Lib파일과 Header파일의 복사
 생략해도 상관없는 단계입니다만, 편의를 위해 제 경우에는 이렇게 했습니다.

 CxImage 라이브러리의 압축을 푼 폴더의 하위 폴더인 CxImage폴더에 접근하여 모든 헤더파일을 임의의 폴더에 복사합니다. Step 2에서 사용하기로 한 이미지 포맷에 해당하는 폴더의 Debug폴더에 들어가 *.lib파일을 역시 임의의 폴더에 복사합니다. (만약 lib파일을 찾을 수 없다면, CxImage의 Debug폴더에 있을 것입니다.)

 이렇게 준비된 파일들이 담긴 폴더를 사용하고자 하는 프로젝트에 복사합니다. (제 경우는 cximg_include폴더에서 관리했습니다.)


Step 4. 준비는 끝. 실습 시작.
 이제 준비는 끝났으며 VS2005를 이용해 간단한 예제를 만들어 보겠습니다.
 파일> 새로만들기> 프로젝트 를 선택해 MFC 응용 프로그램을 만듭니다. 응용 프로그램 종류 탭에서 응용 프로그램 종류는 대화 상자 기반에 체크 하고 유니코드 라이브러리 사용은 체크 해제하고 마침을 눌러 프로젝트를 생성합니다.
 프로젝트가 정상적으로 생성되었다면 아까 만들었던 라이브러리와 헤더파일이 담긴 폴더를 프로젝트 폴더의 하위로 복사합니다. 그 후 프로젝트 속성 페이지를 열어 구성 속성> 링커> 일반의 추가 라이브러리 디렉토리에서 헤더파일과 라이브러리가 담긴 폴더를 링크합니다. 다시 구성 속성> 링커> 입력으로 이동해서 추가 종속성 탭에서 아까 빌드한 라이브러리 파일을 링크합니다.

그림 2. 추가 종속성을 링크한 모습.


 라이브러리와 헤더링크가 되었다면 이번엔 리소스뷰> 프로젝트 명> 프로젝트 명.rc> Dialog> IDD_프로젝트 명_DIALOG를 더블클릭해서 엽니다. 도구상자에서 Picture Control을 선택하여 다이얼로그 윈도우에서 클릭하면 네모난 선으로 된 상자가 나타나는데 이를 속성에 들어가서 ID를 IDC_Pic(IDC_임의)로 Type을 Bitmap으로 바꾸어 줍니다.

그림 3. Picture Control 설정법.


 그 후 선인장 모양으로 바뀐 Picture Control을 우클릭해서 변수 추가를 눌러준 후 변수 이름 칸에 m_pic(임의)를 입력한 후 마침을 눌러 변수를 추가해줍니다.
 솔루션 탐색기> 프로젝트 명Dlg.cpp 파일을 열어 OnInitialUpdate부분에 아래 내용만 추가해주면 됩니다.

 CxImage cimage;
 HBITMAP m_bitmap = NULL;
 cimage.Load("Sample.jpg", CXIMAGE_FORMAT_JPG);
 m_bitmap = cimage.MakeBitmap(m_pic.GetDC()->m_hDC);
 m_pic.SetBitmap((HBITMAP)m_bitmap);

그림 4. 프로그램을 실행한 화면.



 Step ex. Link Error에 대처하는 우리들의 자세.
 정상적으로 프로그램을 코딩하고, 라이브러리, 헤더파일을 잘 링크했음에도 불구하고 Link Error가 발생하는 경우가 있습니다. 이는 프로젝트를 유니코드로 작성했을 경우에 발생하는 에러인데, 그 이유는 ximage.h 파일에 정의된 Save와 Load함수의 인자가 const TCHAR*로 되 어있기 때문입니다. 유니코드를 컴파일을 하게 되면 TCHAR는 wchar_t로 변경되는데, CxImage 라이브러는 이미 Ansi코드로 컴파일 되었기 때문에 에러가 발생하게 됩니다.

 따라서 이 문제의 해결 방법은 ximage.h 파일을 열어 Save와 Load부분의 TCHAR*를 CHAR로 변경하면 됩니다. 이 문제를 피하기 위해 위의 Step 4. 에서는 유니코드 라이브러리를 사용하지 않고 멀티바이트로 작업을 했던 것입니다.
저작자 표시 비영리

'프로그래밍 > 라이브러리' 카테고리의 다른 글

[CxImage] CxImage를 이용한 이미지 표현  (3) 2009/04/19
Posted by 크리스_

댓글을 달아 주세요

  1. 좋은 정보 감사드립니다.
    vs6.0에서 vs2005로 옮기고 나서 안되는 것이 많네요.
    덕분에 그림 출력 부분이 해결되어 한숨 놓았습니다.
    감사합니다. 복받으세요~~

    2009/06/04 20:27 [ ADDR : EDIT/ DEL : REPLY ]
    • 도움이 되었다니 기쁘네요.
      늘 건승하시고, 즐거운 날들 되시기 바랍니다. :)

      2009/06/08 16:50 [ ADDR : EDIT/ DEL ]
  2. 초보 개발자

    와 정말 좋은 정보네요!!!
    한시간 가량 해맸는데... 정말 감사합니다.
    항상 건강하시고 행복하세요!

    2010/01/20 10:11 [ ADDR : EDIT/ DEL : REPLY ]