2017-05-26 4 views
1

Je veux capturer une partie de l'écran et l'enregistrer dans BMP. Pour enregistrer l'image, je prévois avec SOIL. Les fonctions de bits bliting obtiennent here.Capture d'écran complète de BMP. Problème avec bliting et enregistrement

code:

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; 
} 

En sortie, j'obtiens ceci:

Broken BMP

Il semble que question RGBA/RGB, mais je ne contiendraient pas nulle part RGBA. Qu'est-ce que j'ai manqué dans le code? C'est la bonne façon d'obtenir une capture d'écran?

Répondre

2

Vous créez une image de 32 bpp, mais transmettez 3 à SOIL_save_image en indiquant qu'il s'agit d'une image de 24 bpp.