반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

폴크(FOLC)

MFC 테크닉 - 스크린 캡쳐 (Bitmap) 본문

C, C++, MFC/C, C++, MFC 테크닉

MFC 테크닉 - 스크린 캡쳐 (Bitmap)

folcjin 2021. 12. 13. 20:10
728x90
반응형

# 현재 모니터 화면에서 특정한 영역의 정보를 이미지 파일로 저장
   > Bitmap 형태를 이용

# MFC 에서 Bitmap 을 기본으로 제공

# 소스 코드
bool CScreenCapture::CaptureFullscreen()

{
   HDC h_screen_dc = ::GetDC(NULL);
   int dstX = ::GetDeviceCaps(h_screen_dc, HORZRES);
   int dstY = ::GetDeviceCaps(h_screen_dc, VERTRES);
   CaptureROI(h_screen_dc, 0, 0, dstX, dstY);
   if (NULL != h_screen_dc)
   ::ReleaseDC(NULL, h_screen_dc);
   return true;
}
bool CScreenCapture::CaptureROI(HDC hdc, int srcX, int srcY, int dstX, int dstY)
{
   int sizeX = dstX - srcX;
   int sizeY = dstY - srcY;
   BITMAPINFO dib_define;
   dib_define.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
   dib_define.bmiHeader.biWidth = sizeX;
   dib_define.bmiHeader.biHeight = sizeY;
   dib_define.bmiHeader.biPlanes = 1;
   dib_define.bmiHeader.biBitCount = 24;
   dib_define.bmiHeader.biCompression = BI_RGB;
   dib_define.bmiHeader.biSizeImage = (((sizeX * 24 + 31) & ~31) >> 3) * sizeY;
   dib_define.bmiHeader.biXPelsPerMeter = 0;
   dib_define.bmiHeader.biYPelsPerMeter = 0;
   dib_define.bmiHeader.biClrImportant = 0;
   dib_define.bmiHeader.biClrUsed = 0;

   BYTE *p_image_data = NULL;
   HBITMAP h_bitmap = ::CreateDIBSection(hdc, &dib_define, DIB_RGB_COLORS, (void **)&p_image_data, 0, 0);
   HDC h_memory_dc = ::CreateCompatibleDC(hdc);
   HBITMAP h_old_bitmap = (HBITMAP)::SelectObject(h_memory_dc, h_bitmap);
   ::BitBlt(h_memory_dc, 0, 0, sizeX, sizeY, hdc, 0, 0, SRCCOPY);
   ::SelectObject(h_memory_dc, h_old_bitmap);
   DeleteDC(h_memory_dc);
   
   BITMAPFILEHEADER dib_format_layout;
   ZeroMemory(&dib_format_layout, sizeof(BITMAPFILEHEADER));
   dib_format_layout.bfType = *(WORD*)"BM";
   dib_format_layout.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dib_define.bmiHeader.biSizeImage;
   dib_format_layout.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

   bool ret = false;
   FILE *p_file = NULL;
   if (fopen_s(&p_file, m_strSaveFilePath, "wb") == 0)
   {
      fwrite(&dib_format_layout, 1, sizeof(BITMAPFILEHEADER), p_file);
      fwrite(&dib_define, 1, sizeof(BITMAPINFOHEADER), p_file);
      fwrite(p_image_data, 1, dib_define.bmiHeader.biSizeImage, p_file);
      fclose(p_file);
      ret = true;
   }
   if (NULL != h_bitmap)
   DeleteObject(h_bitmap);
   return ret;
}

728x90
반응형
사업자 정보 표시
사업자 등록번호 : -- | TEL : --