파일저장부분에서 애를 많이 먹었다.
탐색기상에서 파일경로에 '\'는 하나만 들어가지만,
코드상에서 \는 \n과 같은데 사용되기 때문에 경로를 위해 사용할때는 \\와 같이 써야한다고 한다.
코드상에서 test.bmp와 같이 설정하였을때는 제대로 이미지가 저장되었지만
C:\\capture\\test.bmp로 설정하니 저장이 되지 않았다.
프로그램상에서 스스로 폴더를 생성하지 못하기때문에 미리 capture폴더를 만들어 뒀어야 했다.
버튼을 누르면 이미지가 저장되도록 하였고,
여러장의 이미지를 관리하기 쉽도록 파일명을 "연월일_시분초.bmp"로 설정하였다.
CreateFile 함수에 들어가는 파일명 인자의 변수형이 LPCWSTR이기 때문에
2번 사이트를 참고하여 CString을 LPCWSRT 타입으로 바꿔주었다.
이 코드에서 저장한 picture control의 변수명은 m_picture이다.
void CWebCamera4Dlg::OnBnClickedButton6() { //DC CDC* pDC =m_picture->GetDC(); HDC hDC = pDC->m_hDC; //picture control 크기 RECT rc; m_picture->GetClientRect(&rc); //비트맵생성 HDC hMemDC = CreateCompatibleDC(hDC); HBITMAP hBitmap = CreateCompatibleBitmap(hDC,rc.right,rc.bottom); HBITMAP hBmpOld = (HBITMAP)SelectObject(hMemDC,hBitmap); BitBlt(hMemDC,0,0,rc.right,rc.bottom,hDC,0,0,SRCCOPY); SelectObject(hMemDC,hBmpOld); DeleteDC(hMemDC); //비트맵사양설정 BITMAPINFOHEADER bmih; ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER)); bmih.biSize = sizeof(BITMAPINFOHEADER); bmih.biWidth = rc.right; bmih.biHeight = rc.bottom; bmih.biPlanes = 1; bmih.biBitCount = 24; bmih.biCompression = BI_RGB; // 비트맵(DIB) 데이터 추출 GetDIBits(hDC,hBitmap,0,rc.bottom,NULL,(LPBITMAPINFO)&bmih,DIB_RGB_COLORS); LPBYTE lpBits = new BYTE[bmih.biSizeImage]; GetDIBits(hDC,hBitmap,0,rc.bottom,lpBits,(LPBITMAPINFO)&bmih,DIB_RGB_COLORS); ReleaseDC(pDC); DeleteObject(hBitmap); // 비트맵 파일 헤더 설정 BITMAPFILEHEADER bmfh; bmfh.bfType = 'MB'; bmfh.bfSize = sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER)+bmih.biSizeImage; bmfh.bfReserved1 = 0; bmfh.bfReserved2 = 0; bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); // 파일명설정 SYSTEMTIME time; GetLocalTime(&time); CString Name; Name.Format(_T("C:\\capture\\CAM1_%4d%2d%2d_%2d%2d%2d.bmp"), time.wYear,time.wMonth,time.wDay, time.wHour,time.wMinute,time.wSecond); _bstr_t gg(Name); BSTR lpszFileName = gg.copy(); // 비트맵 파일 생성 및 데이터 저장 DWORD dwWritten; HANDLE hFile = CreateFile(lpszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); WriteFile(hFile, &bmih, sizeof(BITMAPINFOHEADER), &dwWritten, NULL); WriteFile(hFile, lpBits, bmih.biSizeImage, &dwWritten, NULL); CloseHandle(hFile); delete [] lpBits; }
※ 참고한 사이트
1) 지식iN
2) http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=2269
JAVA | 메일내용에 HTML 태그 넣기 (Java Mail API) (0) | 2015.09.04 |
---|---|
JAVA | 메일 보내기 (Java Mail API) (0) | 2015.09.04 |
JAVA | XML 파싱 + Excel 파일로 내보내기 (0) | 2015.07.17 |
MFC | WMV파일 재생하기 (0) | 2014.11.15 |
MFC | Dialog 배경이미지 넣기 (0) | 2014.11.15 |
MFC | Picture Control을 버튼으로 사용하기 (0) | 2014.11.15 |
MFC | 이미지버튼 만들기 (0) | 2014.11.14 |
MFC | 영상 회전시키기 (0) | 2014.11.14 |