2009년 11월 5일 목요일

[myData]bitmap을 stringstream에 저장, stringstream을 bitmap 변경.

프로젝트 수행 중..

제일 먼저 시도 한 것은 바탕화면을 캡쳐 해서 .jpg 파일이나 .png 파일을 생성!

그다음에는 생성된 파일을 네트워크로 전송하도록 하였다.

그런데..그렇게 하면 불필요한 과정 ( 캡쳐 후 파일을 생성하고 저장하고, 전송 후 destination에서 파일을 생성하고 저장하고..)이 들어가기 때문에!!!

메모리에서 파일로 저장을 하지 않고 stringstream을 통해 전송하도록..변경했다.

아..MFC를 control하는 것은 참..힘든거 같다.

 

그럼..방법을 알아봅시다. ^^

 

// 먼저, 현재 윈도우의 핸들을 얻어와야 겠죠?

CWnd* pWndDesktop = CWnd::GetDesktopWindow();
 HBITMAP hbitmap;
 HBITMAP oldBmp;
 HDC  hWindowDC;
 HDC  hMemDC;
 CRect Rect;
 int  nScreenWidth, nScreenHeight;

 

 hWindowDC = GetWindowDC(pWndDesktop->m_hWnd);

// 전체 화면의 크기를 Rect에 저장.
 pWndDesktop->GetWindowRect(&Rect);

 nScreenWidth  = Rect.Width();
 nScreenHeight =  Rect.Height();

// 현재 윈도우와 호환되는 DC 생성.

 hMemDC = CreateCompatibleDC(hWindowDC);
 hbitmap = CreateCompatibleBitmap(hWindowDC, nScreenWidth, nScreenHeight);
 oldBmp = (HBITMAP) SelectObject(hMemDC, hbitmap);
 BitBlt(hMemDC, 0, 0, nScreenWidth, nScreenHeight, hWindowDC, 0,0, SRCCOPY);

 

 

이 과정을 거치면..자신의 전체 바탕화면을 캡쳐할 수 있습니다.

 

그리고..bitmap을 stringstream에 저장하기 위해.. char 배열로 변경합니다.

 

char * pbuff_bitmap = new char[dwBufferSize];

 int size;
 size = GetBitmapBits(hbitmap,dwBufferSize, pbuff_bitmap);

 if(dwBufferSize != size)
 {
  AfxMessageBox("메모리에 할당된 비트맵 정보와 현재 비트맵 정보가 다르다!");
 }

 

이렇게 하면 char 배열에 bitmap이 저장됩니다!

 

이것을 가지고 stringstream을 전송한 후 char 배열에 다시 읽어들여 bitmap으로 생성해주면 됩니다.

(물론..저는 여기서 boost 를 사용해서 zlib로 압축 후 전송, 해제하도록 하였습니다. 그대로 보내주는건..너무 크기 때문에?!ㅋ)

int size;
 size = SetBitmapBits(desthbitmap,dwBufferSize,pbuff_bitmap);

 

전체 소스를 다 넣은 것은 아니구요..

머 암튼..압축된 데이터를 네트워크 전송으로 아직 해보지는 않았지만, 압축한 데이터 전송하고 받은 데이터 해제만 해준다면 문제는 없을 듯..

 

이제 해야하는건..hextile 알고리즘 분석 후 라이브러리화 하기 도전!

저번에 알고리즘 분석하다 말았는데..마저 해야겠군요..@.@

 

댓글 없음:

댓글 쓰기