본문 바로가기

공부/MFC

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

냅다 출력화면부터 보고!



#endif //_DEBUG


//추가부분


inline void RGBtoGray(COLORREF& rgb)

{


BYTE byGray = (GetRValue(rgb) *30

+ GetGValue(rgb) *59

+ GetBValue(rgb) *11) /100;


rgb = RGB(byGray,byGray,byGray);


}



//여기까지

//CSaveGrayDemoView.cpp에 추가하는 코드
//이 코드는 RGB를 흑백화 하는 코드이다. 
/////////////////////////////////


void CSaveGrayDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

CWnd* pWndDesktop = GetDesktopWindow();
CWindowDC ScrDC(pWndDesktop); //바탕화면 윈도우 DC
CClientDC dc(this); //뷰 윈도우 DC

CImage Image;
Image.Create(300,300,ScrDC.GetDeviceCaps(BITSPIXEL)); //바탕화면 크기 및 색상수와 동일한 비트맵 이미지를 만든다.


CDC* pDC = CDC::FromHandle(Image.GetDC());
pDC->BitBlt(0,0,300,300, &ScrDC, 0, 0, SRCCOPY);
Image.ReleaseDC(); //이미지 DC와 화면 DC에 바탕화면 윈도우 DC를 출력한다.


COLORREF rgb;
for(int x = 0; x<200; x++)//폭
for(int y = 0; y <200; ++y)//높이
{
rgb = Image.GetPixel(x,y);
//여기부터
RGBtoGray(rgb);
Image.SetPixel(x,y,rgb);      //Gray RGB값으로 변환

}
}

Image.BitBlt(dc.m_hDC,0,0); //흑백으로 변환된 이미지를 화면 DC에 출력

CView::OnLButtonDown(nFlags, point);
}

해당 코드대로 입력한 경우 + 윈도우창을 바탕화면상의 왼쪽 위에 둔채로 마우스 클릭을 하게되면 위과 같은 출력화면이 나온다. 

 바탕화면 일부분 스캔 + 일부분 흑백화 [클릭으로 출력활성화되며 onpaint가 아니고 OnLButtonDown이므로  윋도우 크기변경이나 이동겹침등으로 지워질 수 있다.


  

 CImage 클래스의 Create()메서드의 원형은 다음과 같다.

BOOL CImage::Create( int nWidth, int nHeight, int nBPP, DWORD dwFlags = 0) throw() ;

마지막 인자의 기본값이 0이며 이번 예제에서도 이 값을 사용하였다.
이 인자는 32비트 비트맵의 경우에 알파채널을 명시한다. 세번째 인자인 int nBPP 가 반드시 32 가 되어야 알파채널 을 명시할 수있다. 
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

다음은 해당 프로젝트에서 우클릭 을 하면 바탕화면을 별도의 이미지 파일로 저장하여 보여주는 코드이다.

이 역시 핸들러를 통해 추가하고 코드를 넣는다.



void CSaveGrayDemoView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.




CWnd* pWndDesktop = GetDesktopWindow();
CWindowDC ScrDC(pWndDesktop); //바탕화면 윈도우 DC
CClientDC dc(this); //뷰 윈도우 DC

CRect Rect;
pWndDesktop->GetWindowRect(&Rect); //바탕화면 윈도우의 크기를 알아낸다.

CImage Image; //바탕화면 크기 및 색상수와 동일한 비트맵 이미지를 만든다.
int cx = Rect.Width(); //바탕화면의높이
int cy = Rect.Height(); //바탕화면의 넓이
Image.Create(cx,cy,ScrDC.GetDeviceCaps(BITSPIXEL));

CDC* pDC = CDC::FromHandle(Image.GetDC());
pDC->BitBlt(0,0,cx,cy, &ScrDC,0,0,SRCCOPY);
dc.BitBlt(0,0,cx,cy, pDC,0,0,SRCCOPY);
Image.ReleaseDC();                    //이미지 DC와 화면 DC에 바탕화면 윈도우 화면을 출력한다.

Image.Save(TEXT("Desktop.jpg"),Gdipluse::ImageFormatJPEG); 
//JPEG형식으로 바탕화면 이미지를 저장한다.
::ShellExecute(NULL, TEXT("open"), TEXT("Desktop.jpg"), NULL,NULL,SW_SHOW);


CView::OnRButtonDown(nFlags, point);
}

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

바탕화면 윈도우의 크기를 알아내기 위해  GetWindowRect()함수를 사용한 부분과

이미지 저장 및 뷰어 실행을 빼면 왼클릭 함수와 크게 다르지 않다.

예제에서 Save() 함수는 현재 선택한 비트맵 이미지를 주어진 파일 형식으로 변환하여 저장하는 역할을 한다.

장 가능한 파일 형식으로는 ImageFormatGIF,ImageFormatBMP,ImageFormatPNG 등이 있다.

마지막에 있는 ::ShellExecute 라고 쓰인 API함수는  윈도우 탐색기에서 해당 파일을 더블클릭한 것과 같은 동작을 나타내는 함수이다.


원형과 인자에 관한 설명은 은 다음과 같다.



//////////////////////////
////////////////
 해당 코딩 후

좌클릭을 먼저하고  우클릭을 한 경우.

이러한 화면이 캡쳐되어 뜨게된다.

 

 또한 프로그램이 있는 위치에 Desktop.jpg 라는 파일이 하나 생기고 여기에 저 화면이 입력되어있게 된다.


마지막으로 코드가 있는 파일을 업로드.