2017-05-26 39 views
1

我想捕獲屏幕的一部分並將其保存到BMP中。爲了保存圖片,我計劃使用SOIL。 Bit bliting功能我得到hereBMP截圖。用bliting和保存問題

代碼:

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圖像。