2017-04-03 20 views
-1

BITMAPINFOHEADERをバイト配列に変換して、TCPソケット接続を介して送信したいとします。デスクトップ画面をキャプチャできます。画像はBITMAPINFOHEADERです。 それを変換するC++を使用してBITMAPINFOHEADERをバイト配列に変換するには

void CaptureAndSendScreen() 
{ 
    HDC hdcScreen; 
    HDC hdcWindow; 
    HDC hdcMemDC = NULL; 
    HBITMAP hbmScreen = NULL; 
    BITMAP bmpScreen; 

    HWND hWnd = GetDesktopWindow(); 

    // Retrieve the handle to a display device context for the client 
    // area of the window. 
    hdcScreen = GetDC(NULL); 
    hdcWindow = GetDC(hWnd); 

    // Create a compatible DC which is used in a BitBlt from the window DC 
    hdcMemDC = CreateCompatibleDC(hdcWindow); 

    if(!hdcMemDC) 
    { 
     //MessageBox(hWnd, L"CreateCompatibleDC has failed",L"Failed", MB_OK); 
     goto done; 
    } 

    // Get the client area for size calculation 
    RECT rcClient; 
    GetClientRect(hWnd,&rcClient); 

    //This is the best stretch mode 
    SetStretchBltMode(hdcWindow,HALFTONE); 

    //The source DC is the entire screen and the destination DC is the current window (HWND) 
    if(!StretchBlt(hdcWindow, 
     0,0, 
     rcClient.right, rcClient.bottom, 
     hdcScreen, 
     0,0, 
     GetSystemMetrics (SM_CXSCREEN), 
     GetSystemMetrics (SM_CYSCREEN), 
     SRCCOPY)) 
    { 
     MessageBox(hWnd, "StretchBlt has failed","Failed", MB_OK); 
     goto done; 
    } 

    // Create a compatible bitmap from the Window DC 
    hbmScreen = CreateCompatibleBitmap(hdcWindow, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top); 

    if(!hbmScreen) 
    { 
     MessageBox(hWnd, "CreateCompatibleBitmap Failed","Failed", MB_OK); 
     goto done; 
    } 

    // Select the compatible bitmap into the compatible memory DC. 
    SelectObject(hdcMemDC,hbmScreen); 

    // Bit block transfer into our compatible memory DC. 
    if(!BitBlt(hdcMemDC, 
     0,0, 
     rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, 
     hdcWindow, 
     0,0, 
     SRCCOPY)) 
    { 
     MessageBox(hWnd, "BitBlt has failed", "Failed", MB_OK); 
     goto done; 
    } 

    // Get the BITMAP from the HBITMAP 
    GetObject(hbmScreen,sizeof(BITMAP),&bmpScreen); 

    BITMAPFILEHEADER bmfHeader;  
    BITMAPINFOHEADER bi; 

    bi.biSize = sizeof(BITMAPINFOHEADER);  
    bi.biWidth = bmpScreen.bmWidth;  
    bi.biHeight = bmpScreen.bmHeight; 
    bi.biPlanes = 1;  
    bi.biBitCount = 32;  
    bi.biCompression = BI_RGB;  
    bi.biSizeImage = 0; 
    bi.biXPelsPerMeter = 0;  
    bi.biYPelsPerMeter = 0;  
    bi.biClrUsed = 0;  
    bi.biClrImportant = 0; 

    DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31)/32) * 4 * bmpScreen.bmHeight; 

    // Starting with 32-bit Windows, GlobalAlloc and LocalAlloc are implemented as wrapper functions that 
    // call HeapAlloc using a handle to the process's default heap. Therefore, GlobalAlloc and LocalAlloc 
    // have greater overhead than HeapAlloc. 
    HANDLE hDIB = GlobalAlloc(GHND,dwBmpSize); 
    char *lpbitmap = (char *)GlobalLock(hDIB);  

    // Gets the "bits" from the bitmap and copies them into a buffer 
    // which is pointed to by lpbitmap. 
    GetDIBits(hdcWindow, hbmScreen, 0, 
     (UINT)bmpScreen.bmHeight, 
     lpbitmap, 
     (BITMAPINFO *)&bi, DIB_RGB_COLORS); 

    // **need to convert bi into Byte array and send through TCP socket** 

    //Unlock and Free the DIB from the heap 
    GlobalUnlock(hDIB);  
    GlobalFree(hDIB); 

//Clean up 
done: 
    DeleteObject(hbmScreen); 
    DeleteObject(hdcMemDC); 
    ReleaseDC(NULL,hdcScreen); 
    ReleaseDC(hWnd,hdcWindow); 
} 
+0

私はあなたの質問を理解することはできません。 'bi'は構造体なので、'&bi'は 'char *'にキャストでき、 'bi'のサイズを知ることができます。何がもっと必要ですか? –

答えて

0

あなたは必要はありません。以下は、私が試してみましたコードです。 send()ソケット関数は、任意のメモリバッファへのポインタを取るので、BITMAPINFOHEADERとピクセルデータをそのままに送ることができます。唯一の注意点はsend()char*ポインタを期待されていますが、まさにそのために型キャストを使用することができ、例えば:

send(theSocket, (char*)&bi, sizeof(bi), 0); 
send(theSocket, lpbitmap, dwBmpSize, 0); 
+0

それは働いたが、別の問題がある。受信側では、受信した画像を表示するC#のソケットがあります。しかし、これを画像に変換する際に、 'Parameter is not valid'という例外が発生します。どうすればこの問題を解決できますか? –

+0

新しい質問として投稿する必要がある@JithinJose。そして、あなたが使用している実際のコードを表示してください。 –

関連する問題