본문 바로가기
프로그래밍/MFC

MFC-CImage 클래스

by 리뷰하는 (게임)프로그래머_리프TV 2010. 5. 17.



기존의 이미지를 출력하는 방식이 아닌
MFC에서 추가된 CImage를 사용해 보자.

// View::OnPaint()
	// 이미지가 저장된 위치
	CString strImagePath = _T("Image.bmp");

	// CImage 클래스 변수를 생성한다.
	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.TransparentBlt( dc.m_hDC, 0, 0, Image.GetWidth(), Image.GetHeight(), RGB(255, 0, 0) );
	Image.BitBlt( dc.m_hDC, 300, 0 );

	// 흑백으로 변경해 보자.
	COLORREF rgb;
	
	for( int x=0; x<Image.GetWidth(); ++x )
	{
		for( int y=0; y<Image.GetHeight(); ++y )
		{
			rgb = Image.GetPixel( x, y );
			RGBtoGray( rgb );
			Image.SetPixel( x, y, rgb );
		}
	}

	// 흑백의 이미지 출력
	Image.BitBlt( dc.m_hDC, 0, 300 );​


소스 코드 자체가 딱히 어려운 부분은 없다. 마지막에 흑백으로 출력 하는 부분이 있는데,
RGBtoGray라는 부분은 inline으로 선언되 있다.

// View.cpp
inline void RGBtoGray( COLORREF& rgb )
{
	BYTE byGray = (GetRValue(rgb) * 30
		+ GetGValue(rgb) * 59
		+ GetGValue(rgb) * 11 ) / 100;

	rgb = RGB(byGray, byGray, byGray);
}​


흑백으로 변경하는 알고리즘은 거의 공식화 되어 있다고 하니 그냥 단순하게 기억해 두자.
CImage에서는 bmp뿐만 아니라 jpg, gif, png등이 있다고 한다.

CImage를 사용하기 위해서는 반드시
#include <atlimage.h> 를 해 주어야 한다.

// 실행 화면


단점은, 이미지에 대해서 모든 픽셀을 변경해서 다시 픽셀을 설정해 주기 때문에, 예제 처럼 WM_PAINT에서 매번 처리하기에는 비효율 적이다.
WM_CREATE나 또는 한번만 불러오게 변경하여, 추가 이미지를 생성하여 그 안에 변경후 저장해 두는 것이 훨씬 나은 구현 방법일 것이다.

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-TextRgn( 게이지에 따른 텍스트 변화 )  (0) 2010.05.19
MFC-CImage( 스크린 샷 찍기 )  (0) 2010.05.17
MFC-비트맵 띄우기  (0) 2010.05.16
MFC-가상 버튼 만들기  (0) 2010.05.16
MFC-부채꼴 그리기  (0) 2010.05.16