본문 바로가기

app/C

MFC 화면 캡쳐해서 저장하기~

캡쳐해서 전송까지 해야되는데..ㅜㅡㅜ 왜 않되는지를 모르겠다.(용량이 너무 커서 전송 중간에 포인터가 끼어드는거  같기도 하고, 너무 커서 못보내는건 아닐텐데..)

HDC h_screen_dc = ::GetDC(NULL);
// 현재 스크린의 해상도를 얻는다.
int width = ::GetDeviceCaps(h_screen_dc, HORZRES);
int height = ::GetDeviceCaps(h_screen_dc, VERTRES);
// DIB의 형식을 정의한다.
BITMAPINFO dib_define;
dib_define.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
dib_define.bmiHeader.biWidth = width;
dib_define.bmiHeader.biHeight = height;
dib_define.bmiHeader.biPlanes = 1;
dib_define.bmiHeader.biBitCount = 24;
dib_define.bmiHeader.biCompression = BI_RGB;
dib_define.bmiHeader.biSizeImage = (((width * 24 + 31) & ~31) >> 3) * height;
dib_define.bmiHeader.biXPelsPerMeter = 0;
dib_define.bmiHeader.biYPelsPerMeter = 0;
dib_define.bmiHeader.biClrImportant = 0;
dib_define.bmiHeader.biClrUsed = 0;
// DIB의 내부 이미지 비트 패턴을 참조할 포인터 변수
BYTE *p_image_data = NULL;
// dib_define에 정의된 내용으로 DIB를 생성한다.
HBITMAP h_bitmap = ::CreateDIBSection(h_screen_dc, &dib_define, DIB_RGB_COLORS, (void **)&p_image_data, 0, 0);
    // 이미지 추출하기 위해서 가상 DC 생성. 메인 DC에서는 직접적으로 비트맵에 접근하여
   // 이미지 패턴을 얻을 수 없기 때문이다.
HDC h_memory_dc = ::CreateCompatibleDC(h_screen_dc);
// 가상 DC에 이미지를 추출할 비트맵을 연결한다.
HBITMAP h_old_bitmap = (HBITMAP)::SelectObject(h_memory_dc, h_bitmap);
// 현재 스크린 화면을 캡쳐한다.
::BitBlt(h_memory_dc, 0, 0, width, height, h_screen_dc, 0, 0, SRCCOPY);
// 본래의 비트맵으로 복구한다.
::SelectObject(h_memory_dc, h_old_bitmap);
// 가상 DC를 제거한다.
DeleteDC(h_memory_dc);
// DIB 파일의 헤더 내용을 구성한다.
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);
//현재 디렉토리에서 한 순위를 내려간후 [data]\\save\\ 폴더에 저장
CString directory;
// DIB 파일을 생성한다.
FILE *p_file = fopen("image.bmp", "wb");
if(p_file != NULL){
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);
}
        if(NULL != h_bitmap) DeleteObject(h_bitmap);
if(NULL != h_screen_dc) ::ReleaseDC(NULL, h_screen_dc);

Timer와 함께 쓰니 초당 화면캡쳐가 된다..+_+ 전송이 되야 쓰던가 하지..췟
근데..역시 bmp라 용량이 그냥 5메가다..ㅡ,.ㅡ;
잘되는구료~ㅎㅎㅎㅎ-_- 어디다 쓰지?ㅋㅋ