본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 8 비트맵 및 이미지 처리 - 3

BMP파일이 아닌 다른 이미지 파일을 출력하는 함수에 관한 내용.

1. CImage를 사용하려면 atlImage.h를 인클루드 해야함.

2. 예제에서는 상대경로를 집어넣은지라 기본 경로가 해당 프로젝트가 있는 폴더 이지만 절대경로를 입력해주어도 됨.

3. 이 함수가 지원하는 형식은 BMP, JPEG/JPG, GIF , PNG 등임.

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

프로젝트명은 ImgOutDemo

흔한SDI문서로 제작하고

Cpp파일의 선언부에 다음 코드를 추가하여 인클루드함.

//추가부분
#include <atlimage.h>
//종료


다음으로 흔한 OnPaint를 작성하고 다음과 같이 코딩.

 // CImgOutDemoView 메시지 처리기

void CImgOutDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.

CString strImagePath = _T("IMG_0076.jpg");//로드할 이미지 파일의 경로
CImage Image;
HRESULT hResult = Image.Load(strImagePath);
if(FAILED(hResult))
{
CString strtmp = _T("ERROR: Failed to load ");
strtmp += strImagePath + _T("\n");
TRACE(strtmp);
return;
}

Image.BitBlt(dc.m_hDC, 0, 0);//화면 DC에 출력


}

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

이럴경우 이미지 파일을 어느 폴더에 위치시켜야 하냐면

평소처럼 res가 아닌 그 상위 폴더에 위치시켜야 출력이 된다.

기본 경로가 그리 정해져 있기 때문이다. 

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

유사 함수로는 LoadFromResource()라는 메서드가 있다. 이는 이러이러하게 사용한다는 의미로 코드를 먼저 적으면..



void CImgOutDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting

CImage Image;

Image.LoadFromResource(AfxGetInstanceHandle(), IDB_Image_Test); //비트맵 리소스를 로드하여 DIB를 만든다.


CDC* pDC = CDC::FromHandle(Image.GetDC()); //비트맵 이미지에 대한 DC를 생성한다.

pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(200, 30, TEXT("CImage sample!"));
Image.ReleaseDC();                                      //이 이미지DC에 문자열을 출력한다.


Image.BitBlt(dc.m_hDC, 0, 0); //이미지를 화면DC에 출력한다.

//화면DC에 문자열을 출력한다.
// dc.SetBkMode(TRANSPARENT);
// dc.TextOut(200, 30, TEXT("CImage sample!"));//이 부분은 왜 주석처리 할거면서 적는지 모르겠다.
}


//코드를 직접 적어야 하지만 책 내용이 그림파일까지 자기들 멋대로 정해두었으므로..
그래서 그림파일을 갈아치우자...



출력된 이미지에 CImage sample! 이라는 문구가 적혀서 출력됨을 알 수 있다.

이렇게 글씨를 그림 위에 쓰는것은 두가지 방법이 있는데

하나는 이미지 DC에 문자열을 출력하여 변경된 이미지를 화면 DC에 출력하는 법

하나는 화면 DC에 이미지를 출력한 다음 문자열을 화면 DC 출력하는 법 이 있다.

뭐가 다른지는 방법이 다른것이며 후에 쓰일때가 다르다고 한다. 

현재 코드에서는 두번째 방법을 사용하고 있다.



CImage 클래스의 BitBlt함수는 자주 사용되므로 원형의 인자를 보도록 하자.

이번 코드에서는 첫번째 원형이 쓰였었다.


CImage::BitBlt( HDC hDestDC, int xDest, int yDest, DWORD dwROP = SRCCOPY) const throw();

CImage::BitBlt( HDC hDestDC, const POINT& pointDest, DWORD dwROP = SRCCOPY) const throw();
 
CImage::BitBlt( HDC hDestDC, int xDest, int yDest, int nDestWidth, 
int nDestHeight, int xSrc, int ySrc, DWORD dwROP = SRCCOPY) const throw();
 
CImage::BitBlt( HDC hDestDC, const RECT& rectDest, 
const POINT& pointSrc, DWORD dwROP = SRCCOPY) const throw();

책에서는 그냥 강의나 보라고 한다.[3개월밖에 못보면서..] 혹은 msdn참조여 이러고 맘..

http://msdn.microsoft.com/ko-kr/library/c431046z(v=VS.90).aspx

2008버전 기준의 MSDN 링크.

표로 만들면 참 좋겠지만.. 혹시 링크 따라가기가 힘든 사람들을 위해 그냥 긁어서 붙여놓기라도 해두자.



이제 파일 업로드.