본문 바로가기

공부/MFC

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

새 단어가 많아서 써두는 


=====================================================

비트맵 이미지를 출력하는 전형적인 방법은

리소스로 등록된 비트맵 이미지를 메모리 DC에 로드하여 화면DC로 출력 하는 것  

이것을 BitBlt() 라고 함.

이미지의 크기를 변경하는 함수  : StretchBlt()
일부 영역을 투명하게 처리하는 함수 : TransparentBlt()

반투명하게 처리하는 함수 : AlphaBlend()

비트맵에 대한 이론

비트맵은 장치 의존적인 비트맵과 장치 독립적인 비트맵 으로 나뉘어진다.

         Device Dependen Bitmap // Device Independent Bitmap

우리가 아는 비트맵은 모두 DIB라고 봐도 무방하다고 한다.

===================================================

-----------------본문달리기. -----------

1. 아무 이미지 파일이든 bmp파일을 프로젝트 내의 res폴더로 한개 이동시킨다.[복사도 상관없음..]

2. 다음과 같은 방법으로 프로젝트에 리소스를 추가한다.



3.클릭해서 무슨 그림인지 확인합니다.[...?]

4. 이름을 수정하여 IDB_Test_Image 로 만듭니다.
 
5. WM_PAINT 메시지 핸들러 함수 onpaint를 등록하고 다음과 같이 코딩합니다.


void CBmpDisplayDemoView::OnPaint()

{

CPaintDC dc(this); // device context for painting

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

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



CDC MemDC;

BITMAP bmpInfo;


MemDC.CreateCompatibleDC(&dc);//화면 dc와 호환되는 메모리 dc를 생성한다.


CBitmap bmp;

CBitmap* pOldBmp = NULL;

bmp.LoadBitmap(IDB_Test_Image);//비트맵 리소스를 로딩한다.

bmp.GetBitmap(&bmpInfo);//로딩된 비트맵의 정보를 알아본다.


pOldBmp = MemDC.SelectObject(&bmp);//메모리 DC에 선택한다.


dc.BitBlt(0,0,bmpInfo.bmWidth,bmpInfo.bmHeight, &MemDC, 0 , 0 , SRCCOPY);//메모리DC에 들어있는 비트맵을 화면 DC로 복사하여 출력한다.


MemDC.SelectObject(pOldBmp);


}


 

출력화면



코딩내용설명.

비트맵을 저장할 메모리 DC를 생성 하되 출력할 화면의 DC와 호환이 되도록 하고,
비트맵을 로드하고 메모리DC의 비트맵으로 선택. 마지막으로 BitBlt()함수를 호출하여 메모리 DC에 로드된 이미지를 화면 DC로 전송.

이렇게하면 내부적으로 DIB가 DDB로 바뀌어 모니터 화면에 출력되게 된다.

라는군여.

CDC클래스의 CreateCompatibleDC()메서드는 CDC클래스 객체의 주소를 인자로 받으며 CDC클래스 객체와 호환되는 메모리 DC를 생성한다.

메모리 DC란? 출력할 비트맵 이미지를 저장하는 메모리 공간.

CDC 클래스의 BitBlt() [[bitblt에서 l은 L 입니다 ]]의 원형을 보면 다음과 같음.

BOOL BitBlt
(
int x, int y,                   //출력할 윈도우의 좌표
int nWidth, int nHeight,  //출력할 비트맵의 폭과 높이
CDC* pSrcDC,           //출력할 비트맵을 저장한 메모리 DC의 주소
int xSrc, int ySrc,        //메모리 DC에 들어있는 비트맵의 시작 좌표
DWORD dwRop           //적용할 래스터 연산
);

이 코드를 보면 알 수 있듯..

메모리에서 화면으로 이동시켜서 출력할 때에 그림을 약간 잘라서 출력할 수도 있는데.
사각형 으로만 자를 수 있다. [적어도 지금 나온 함수의 인자 상태에선 그렇다.]

래스터 연산 이란 뭘까?


뭐 개인적으론 크게 중요하게 생각하기보다 하나의 속성 쯤으로 생각하면 편할 듯 하다.


 다음으로는 StretchBlt 함수에 관한 코드이다.

아까전에 BitBlt 함수를 주석처리하고 다음과 같이 입력해본다.

dc.StretchBlt(  200,200,         //출력된 좌표
250*2,300*2,         //폭과 높이를 두배 확대
&MemDC,
0,0,                       //원본 이미지 시작 좌표
250, 300,                //원본 이미지의 폭과 높이
SRCCOPY);           //래스터 연산


출력화면은 다음과 같다.

 
 오오 졸가메 아이콘의  크기가 뿔어남.

위치이동도 되었슴미다.

보시다시피 확대/축소 하여 출력하는 함수.

 
여기까지의 파일 업로드!.