DIB 형식 파일로 저장

Projects/CoVNC 2007.02.06 16:39 Posted by soulfree >동네청년<
출처 블로그 > Error 대마왕 ㅋㅋ~ !?!?
원본 http://blog.naver.com/amoros21/140022253596

   CMaptoolDoc* pDoc = GetDocument();


   HANDLE                    hDIB;   

   BITMAPFILEHEADER          bifileHdr;

   BYTE*                     lptrData;

  

   CClientDC dc(this); //클립보드로 현재 이미지를 전송

  

   CDC MemDC;

   MemDC.CreateCompatibleDC(&dc);

  

   CRect rect;

   GetClientRect(rect); //뷰 영역의 크기를 얻어온다   

   rect.right = pDoc->map_arr_x*(pDoc->tile_pixel_x+pDoc->view_size);

   rect.bottom = pDoc->map_arr_y*(pDoc->tile_pixel_y+pDoc->view_size);


   CBitmap BMP;

   BMP.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());

   CBitmap* pOldBitmap = MemDC.SelectObject(&BMP);    // 메모리 DC로 BitMap 선택.

  

   MemDC.BitBlt(0, 0, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY);

   // 현재 화면의 내용을 메모리 DC로 전송한다.


   /////////////////////////////////////////////////////////////////////////////////

   // 클립보드에 캡춰한 비트맵을 설정한다.

   OpenClipboard();        // 현재 클립보드를 연다.

   EmptyClipboard();        // 현재 클립보드의 내용을 모두 제거한다.

   SetClipboardData(CF_BITMAP, BMP.GetSafeHandle()); // Capture한 비트맵 설정

   CloseClipboard();


   MemDC.SelectObject(pOldBitmap);

   BMP.Detach();        // 비트맵 객체 제거


   OpenClipboard();


   //클립보드로 카피된게 DIB 형식이 아니면 바로 리턴.

   if(!IsClipboardFormatAvailable(CF_DIB))

   {

       AfxMessageBox("Image file save Fail");

       return;

   }


   hDIB = ::GetClipboardData(CF_DIB);


   if(!hDIB)

   {

       AfxMessageBox("Image file save Fail");

       CloseClipboard();

       return;

   }   


   CloseClipboard();


   //비트맵 헤더의 크기를 계산하고

   bifileHdr.bfType        = 0x4D42;

   bifileHdr.bfSize        = sizeof(BITMAPFILEHEADER) + GlobalSize(hDIB);

   bifileHdr.bfReserved1    = 0;

   bifileHdr.bfReserved2    = 0;

   bifileHdr.bfOffBits        = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

  


   lptrData = (BYTE *)GlobalLock(hDIB);


   char szFilter[] = "BMP File(*.bmp)|*.bmp|All Files(*.*)|*.*||";

   CFileDialog dlg(FALSE, "bmp", "*.bmp", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);

   if(IDOK == dlg.DoModal())

   {

       CFile file;

       file.Open(dlg.GetPathName(), CFile::modeCreate | CFile::modeWrite);    

       file.Write(&bifileHdr, sizeof(BITMAPFILEHEADER));

       file.Write(lptrData, GlobalSize(hDIB));

       file.Close();      

   }

   GlobalUnlock(hDIB);

   GlobalFree(hDIB); 

참조사이트

http://www.codeguru.com/Cpp/G-M/bitmap/capturing/article.php/c4919/

http://www.codeguru.com/Cpp/G-M/bitmap/capturing/article.php/c4915/

'Projects > CoVNC' 카테고리의 다른 글

vnc 소개  (0) 2007.02.09
Java DataFlavor를 이용한 클립보드 사용  (0) 2007.02.07
DIB 형식 파일로 저장  (0) 2007.02.06
DIB구조  (0) 2007.02.05
DIB를 DDB로 변환  (0) 2007.02.05
BMP를 DDB로 변환  (0) 2007.02.01
TAG ,