일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SERIAL
- compare
- Read
- Pointer
- Overloading
- Unity
- sensor
- aduino
- Contour
- atmega328
- Class
- Binary
- public
- java
- inheritance
- wpf
- Android
- file access
- mfc
- Barcode
- length
- UNO
- stream
- parameter
- preprocessing
- Encapusulation
- digitalRead
- memory
- APP
- flutter
- Today
- Total
폴크(FOLC)
MFC 테크닉 - 스크린 캡쳐 (Bitmap) 본문
# 현재 모니터 화면에서 특정한 영역의 정보를 이미지 파일로 저장
> 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;
}
'C, C++, MFC > C, C++, MFC 테크닉' 카테고리의 다른 글
MFC 테크닉 - 시리얼 통신 ( RS232 ) (0) | 2021.12.14 |
---|---|
MFC 테크닉 - 로그 기록하기 ( spdlog ) (0) | 2021.12.13 |
MFC 테크닉 - TimeCheck ( QPC ) (0) | 2021.12.13 |
MFC 테크닉 - 파일 제어 ( TXT format ) (0) | 2021.12.12 |
MFC 테크닉 - 파일 제어 ( INI format ) (0) | 2021.12.12 |