Programming/MFC2010. 6. 27. 18:12


#include <atlimage.h>

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

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

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

// 이미지 DC와 화면 DC에 바탕 화면 윈도우 화면을 출력한다.
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();

// JPEG 형식으로 바탕
 화면 이미지를 저장한다.
Image.Save(_T("Desktop.jpg"), Gdiplus::ImageFormatJPEG);
// 저장된 이미지를 뷰어를 실행하여 보여준다.
::ShellExecute(NULL,
_T("open"), _T("Desktop.jpg"),
NULL, NULL, SW_SHOW);

CView::OnRButtonDown(nFlags, point);
}

'Programming > MFC' 카테고리의 다른 글

비트맵 및 이미지 처리 - 흑백 변환  (1) 2010.06.27
비트맵과 이미지 처리  (1) 2010.06.22
Posted by zzibong
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
Programming/MFC2010. 6. 22. 00:59



void CBmpDisplayDemoView::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 
 CDC MemDC;
 BITMAP bmpInfo;
 // 화면 DC와 호환되는 메모리 DC 생성
 MemDC.CreateCompatibleDC(&dc);
 // 비트맵 리소스 로딩
 CBitmap bmp;
 CBitmap *pOldBmp = NULL;
 bmp.LoadBitmap(IDB_BITMAP1);
 // 로딩된 비트맵 정보
 bmp.GetBitmap(&bmpInfo);
 // 메모리 DC에 선택
 pOldBmp = MemDC.SelectObject(&bmp);
 // 메모리 DC에 비트맵을 화면 DC로 복사하여 출력
 dc.StretchBlt(20, 20,
  bmpInfo.bmWidth * 2, bmpInfo.bmHeight * 2,
  &MemDC,
  0, 0,
  bmpInfo.bmWidth, bmpInfo.bmHeight,
  SRCCOPY);  // 래스터 연산 값

 dc.TransparentBlt(20, 100,
  bmpInfo.bmWidth * 2, bmpInfo.bmHeight * 2,
  &MemDC,
  0, 0,
  bmpInfo.bmWidth, bmpInfo.bmHeight,
  RGB(0, 0, 0)); // 투명 처리될 색상의 RGB

 MemDC.SelectObject(pOldBmp);

}



/*
래스터 연산
SRCCOPY                    // 메모리 DC의 내용에 변화를 주지 말고 그대로 화면 DC에 복사
SRCAND                       // 원본과 대상을 AND 연산하여 출력
NOTSRCCOPY              // 원본 이미지의 색상을 반전시켜 출력
DSTINVERT                   // 원본 이미지와는 상관없이 대상 이미지를 반전시켜 출력


BOOL BitBlt(
   int x, int y,                   // 출력할 윈도우의 좌표
   int nWidth, int nHeight,  // 출력할 비트맵의 폭과 높이
   CDC* pSrcDC,             // 출력할 비트맵을 저장한 메모리 DC의 주소
   int xSrc, int ySrc,          // 메모리 DC에 들어 있는 비트맵의 시작 좌표
   DWORD dwRop            // 적용할 래스터 연산
);

dc.StretchBlt(200, 200,  // 출력될 좌표
     250 * 2, 300 * 2,     // 폭과 높이를 두배 확대
     &MemDC,
     350, 200,               // 원본 이미지 좌표
     250, 300,               // 원본 이미지의 폭과 높이
     SRCCOPY
);
*/

Posted by zzibong