1. CImage를 이용해서 간단하게 영상파일을 불러와서 그려보자.
#include <atlimage.h> 추가
1) 불러오기
// CImage 클래스 변수를 생성한다. CImage Image; // 저장 된 위치에 이미지를 불러온다. HRESULT hResult = Image.Load( "영상파일.bmp" );
// 이미지를 불러 오는데 실패 했을 경우. if( FAILED( hResult ) ) { CString strtmp = _T("ERROR : Failed to load"); strtmp += strImagePath + _T("\n"); AfxMessageBox(strtmp); } |
2) 화면에 그리기
Image.TransparentBlt( dc.m_hDC, 0, 0, Image.GetWidth(), Image.GetHeight(), RGB(255, 0, 0) );
// color를 gray로 바꾸어 보자. COLORREF rgb; for( int x=0; x<Image.GetWidth(); ++x ) { for( int y=0; y<Image.GetHeight(); ++y ) { rgb = Image.GetPixel( x, y ); int avr = (GetRValue(rgb) + GetGValue(rgb) + GetBValue(rgb))/3; rgb = RGB ( avr,avr,avr ); Image.SetPixel( x, y, rgb ); } }
Image.BitBlt( dc.m_hDC, 300, 0 ); |
3) 파일을 선택하기
wchar_t szFilter[] = _T("Image (*.BMP, *.GIF, *.JPG) | *.BMP;*.GIF;*.JPG | All Files(*.*)|*.*||"); CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter); if(IDOK == dlg.DoModal()) { CString strPathName = dlg.GetPathName(); // 폴더와 파일명 얻기 } |
2. 다음은 영상 메모리를 가져와서 영상 처리를 한 후 출력하는 방법이다.
0) 변수 설정
CBitmap *b ; BITMAP c ; BYTE *Orgdata,*ResultData ; HBITMAP hBitmap ; CString s ; CImage png ; |
1) OnInitDialog()에서 초기화 한다.
hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),"stu03.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE ); b = CBitmap::FromHandle(hBitmap) ; //클래스안에 핸들을 얻어 상태 b->GetBitmap(&c) ; Orgdata = new BYTE[c.bmWidthBytes*c.bmHeight] ; ResultData = new BYTE[c.bmWidthBytes*c.bmHeight] ; b->GetBitmapBits(c.bmWidthBytes*c.bmHeight,Orgdata) ; //확보되었던 메모리안에 데이타를 얻어옴
|
2) OnPaint()
CDC cdc; cdc.CreateCompatibleDC(&dc) ; cdc.SelectObject(b) ;
dc.SetStretchBltMode(COLORONCOLOR); dc.StretchBlt(0,0,c.bmWidth,c.bmHeight,&cdc,0,0,c.bmWidth,c.bmHeight,SRCCOPY); //비율 모드였다.
DeleteDC(cdc) ; |
3) 영상 불러오기
if(png.Load("12344.png") !=0) { MessageBox("파일로딩실패","알림") ; return ; }
hBitmap = png.Detach(); //현재객체에서 핸들을 넘긴다. png.Attach(hBitmap); //hBitmap에 png정보를 넣어준다.
// HBITMAP 핸들값 b = CBitmap::FromHandle(hBitmap) ; //클래스안에 핸들을 얻은 상태 b->GetBitmap(&c) ;
// 영상 메모리 데이터 얻기 Orgdata = new BYTE[c.bmWidthBytes*c.bmHeight] ; ResultData = new BYTE[c.bmWidthBytes*c.bmHeight] ; b->GetBitmapBits(c.bmWidthBytes*c.bmHeight,Orgdata) ; Invalidate(TRUE) ; |
4) 흐리게 영상처리
for(int i=0 ; i<c.bmWidth*c.bmHeight ; i++) { ResultData[i*4+0] = Orgdata[i*4+0]*0.5f; //B ; ResultData[i*4+1] = Orgdata[i*4+1]*0.5f; //G ; ResultData[i*4+2] = Orgdata[i*4+2]*0.5f; //R ; ResultData[i*4+3] = Orgdata[i*4+3]*0.5f; //A ; } b->SetBitmapBits(c.bmWidthBytes*c.bmHeight,ResultData) ; // 메모리안에 데이타를 보낸다. Invalidate(TRUE) ; |
예제 소스:
CImage_Ex.zip