Programming/MFC2010. 6. 27. 17:38


#include <atlimage.h>
inline void RGBtoGray(COLORREF& rgb)
{
BYTE byGray = (GetRValue(rgb) * 30
+ GetGValue(rgb) * 59
+ GetBValue(rgb) * 11)/100;
rgb = RGB(byGray, byGray, byGray);
}

void CSaveGrayDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// 바탕 화면 윈도우 객체에 대한 포인터를 얻음
CWnd* pWndDesktop = GetDesktopWindow();  // 바탕 화면 윈도우 DC
CWindowDC ScrDC(pWndDesktop);                // 뷰 윈도우 DC
CClientDC dc(this);

// 바탕 화면 크기 및 색상수와 동일한 비트맵 이미지를 만든다.
CImage 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();

// 일부(200 * 200)를 흑백 이미지로 변환
COLORREF rgb;
for(int x = 0; x < 200; x++)
{
for(int y = 0; y < 200; ++y)
{
rgb = Image.GetPixel(x, y);
// Gray RGB 값으로 변환
RGBtoGray(rgb);
Image.SetPixel(x, y, rgb);
}
}

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

CView::OnLButtonDown(nFlags, point);
}
Posted by zzibong