2017-05-26 13 views
1

私は画面の一部をキャプチャしてBMPに保存したいと思います。写真を保存するために、私はSOILで計画しています。ビットブリッティング関数はhereです。BMPのスクリーンショットブリッティングと保存の問題

コード:出力オン

bool saveScreen(string path) 
{ 
    string name; 
    SYSTEMTIME sm; 
    GetSystemTime(&sm); 
    name = to_string(sm.wHour) + to_string(sm.wMinute) + to_string(sm.wSecond) + to_string(sm.wMilliseconds) 
    + "_" + to_string(sm.wDay) + to_string(sm.wMonth) + to_string(sm.wYear); 

    path = /*path + "/" +*/ name + ".bmp"; 
    const char *charPath = path.c_str(); 

    BITMAPINFO bmi; 
    auto& hdr = bmi.bmiHeader; 
    hdr.biSize = sizeof(bmi.bmiHeader); 
    hdr.biWidth = screenWidth; 
    hdr.biHeight = screenHeight; 
    hdr.biPlanes = 1; 
    hdr.biBitCount = 32; 
    hdr.biCompression = BI_RGB; 
    hdr.biSizeImage = 0; 
    hdr.biXPelsPerMeter = 0; 
    hdr.biYPelsPerMeter = 0; 
    hdr.biClrUsed = 0; 
    hdr.biClrImportant = 0; 

    unsigned char* bitmapBits; 
    HDC hdc = GetDC(NULL); 
    HDC hBmpDc = CreateCompatibleDC(hdc); 

    BITMAP bm; 
    HBITMAP hBmp = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void**)&bitmapBits, nullptr, 0); 
    SelectObject(hBmpDc, hBmp); 
    BitBlt(hBmpDc, 0, 0, screenWidth, 1024, hdc, 0, 0, SRCCOPY); 

    vector< unsigned char > buf(screenWidth* screenHeight* 3); 

    glPixelStorei(GL_PACK_ALIGNMENT, 1); 
    glReadPixels(0, 0, screenWidth, screenHeight, GL_RGB, GL_UNSIGNED_BYTE, bitmapBits); 

    int texture = SOIL_save_image(charPath, SOIL_SAVE_TYPE_BMP, screenWidth, screenHeight, 3, bitmapBits); 

    return texture; 
} 

私はこれを取得:

Broken BMP

それはRGBA/RGB問題として見えますが、私はどこにもRGBAを設定しません。 コードには何が欠けていますか?スクリーンショットを取得するのは正しい方法ですか?

答えて

2

32 bppイメージを作成しますが、3をSOIL_save_imageに渡して24 bppイメージであることを示します。

関連する問題