CAFE

MFC와 OpenCV

MFC: CImage를 이용한 비트맵 출력

작성자한창호|작성시간16.09.07|조회수730 목록 댓글 0

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


다음검색
현재 게시글 추가 기능 열기
  • 북마크
  • 신고 센터로 신고

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼