[0414수업] SaveGray
■ SaveGray프로젝트를 통해 비트맵을 다루는 방법을 알아봄.
1. View클래스에 LBUTTONDOWN, RBUTTONDOWN 메시지 추가
2. SaveGrayView.cpp에 코드 추가
inline void RGBtoGray(COLORREF& rgb)
{
BYTE byGray = (GetRValue(rgb)*30+GetGValue(rgb)*59+GetBValue(rgb)*11)/100
rgb = RGB(byGray, byGray, byGray);
}
inline형식 지정자의 용도: cpu가 제어권을 넘겨받는 작업을 하지 않음
예를 들어, OnLButtonDown()함수에서 RGBtoGray()함수를 호출하고 사용이 끝난 후에도
cpu에 제어권을 넘기지 않는다.
→ 제어권을 넘겨 주고 받는 작업이 없어지기 때문에 함수의 실행 속도가 굉장히 빨라진다.
그대신, 다른 일반 함수처럼 한 개의 실행코드로 두 개 이상의 호출부와 공유할 수 없다.
다른 곳에서 또 호출할때는 각각의 실행코드가 들어가게 되어(복사의 개념) 내부적으로 실행파일의 크기가 커진다는 단점이 있다.
위의 코드에서 반드시 inline 지정자를 사용할 필요는 없지만 대부분 이렇게 사용하는 이유는?
전체 그림 이미지를 흑백으로 바꾸기 위해 많은 연산작업이 필요하기 때문.
위의 코드는 겨우 픽셀하나를 변환하는 것이다.
3. Com객체인 C이미지 클래스를 사용하기 위해 stdafx.h에 atlimage.h파일 인클루드 헤야함
#include <atlimage.h>
4. SaveGrayView.cpp에 OnLButtonDown()함수 작성
void CSaveGrayView::OnLButtonDown(UINT nFlags, CPoint point)
{
// 바탕화면 크기 및 색상수와 동일한 비트맵 이미지를 만든다.
CWnd* pWndDesktop = GetDesktopWindow();
CWindowDC ScrDC(pWndDesktop); // 바탕화면 윈도우 DC
CClientDC dc(this); // 뷰 윈도우 DC(바탕화면의 비트맵을 가져와 내 뷰에 넣기위함)
CImage Image;
// 바탕화면의 크기 및 색상수와 동일한 비트맵 이미지를 Image 객체에 만들어 준다.
Image.Create(300, 300, ScrDC.GetDeviceCaps(BITSPIXEL));
// 이미지DC와 화면DC에 바탕화면 윈도우 DC를 출력한다.
CDC* pDC = CDC::FromHandle(Image.GetDC());
pDC->BitBlt(0, 0, 300, 300, &ScrDC, 0, 0, SRCCOPY);
Image.ReleaseDC();
//Gray 이미지로 변환
COLORREF rgb;
for (int x=0; x<100; x++)
{
for (int y=0; y=100; y++ )
{
rgb = Image.GetPixel(x,y);
RGBtoGray(rgb);
Image.SetPixel(x, y, rgb);
}
}
Image.BitBlt(dc.m_hDC, 0, 0);
CView::OnLButtonDown(nFlags, point);
}