Screenshot in kleine Datei speichern



  • Hallo zusammen, ich habe folgenden Code, um einen Screenshot zu erstellen:

    #include <windows.h> 
    #include <string> 
    #include <iostream> 
    
    #pragma comment(lib, "Gdi32.lib")
    
    using namespace std; 
    
    class CStellwerk 
    { 
    private: 
        HWND m_hDesktop; 
    public: 
    
        void MakeScreenshot(char SavePath[]); 
        void SaveScreen(HWND pScreen, char Path[]); 
    }; 
    
    void CStellwerk::MakeScreenshot(char SavePath[]) 
    { 
         m_hDesktop =  GetDesktopWindow(); 
         if(m_hDesktop == NULL) 
         { 
             exit(1); 
         } 
         SaveScreen(m_hDesktop,SavePath); 
    } 
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow) 
    { 
        CStellwerk Stellwerk; 
        Stellwerk.MakeScreenshot("screen.bmp"); 
    
    } 
    
    void CStellwerk::SaveScreen(HWND pScreen, char Path[]) 
    { 
    int     nWidth  = GetSystemMetrics(SM_CXSCREEN); 
    int     nHeight = GetSystemMetrics(SM_CYSCREEN);
    char acUserName[100]; 
    
    HWND    hWnd    = ::GetDesktopWindow(); 
    HDC     hdc     = ::GetDC(hWnd); 
    HDC     memDC   = ::CreateCompatibleDC(hdc); 
    HBITMAP hbm     = ::CreateCompatibleBitmap(hdc, nWidth, nHeight); 
    HBITMAP hbmOld  = (HBITMAP)::SelectObject(memDC, hbm); 
    
    ::BitBlt(memDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY); 
    
    BITMAPINFO bmi; 
    
    ZeroMemory(&bmi, sizeof(bmi)); 
    
    bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER); 
    bmi.bmiHeader.biWidth        = nWidth; 
    bmi.bmiHeader.biHeight       = nHeight; 
    bmi.bmiHeader.biBitCount     = 24; 
    bmi.bmiHeader.biPlanes       = 1; 
    bmi.bmiHeader.biCompression  = BI_RGB; 
    bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biBitCount * nWidth * nHeight / 8; 
    
    BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage]; 
    
    ::GetDIBits( memDC, 
                 hbm, 
                 0, 
                 bmi.bmiHeader.biHeight, 
                 pbBits, 
                 &bmi, 
                 DIB_RGB_COLORS ); 
    
    BITMAPFILEHEADER bfh; 
    
    bfh.bfType      = ('M' << 8) + 'B'; 
    bfh.bfSize      = sizeof(BITMAPFILEHEADER)  + 
                      bmi.bmiHeader.biSizeImage + 
                      sizeof(BITMAPINFOHEADER); 
    bfh.bfReserved1 = 0; 
    bfh.bfReserved2 = 0; 
    bfh.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 
    // 
    //  Hier: 
    // 
    
    DWORD nUserName = sizeof(acUserName);
    if (GetUserName(acUserName, &nUserName)){}
    
    HANDLE hfile = CreateFile( "screen.bmp",  //TEXT(acUserName), // UM DIESE ZEILE GEHT ES! 
                               GENERIC_WRITE, 
                               0, 
                               0, 
                               OPEN_ALWAYS, 
                               0, 
                               0 ); 
    
    DWORD dwWritten; 
    
    WriteFile(hfile,&bfh,           sizeof(bfh),               &dwWritten, NULL); 
    WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER),  &dwWritten, NULL); 
    WriteFile(hfile,pbBits,         bmi.bmiHeader.biSizeImage, &dwWritten, NULL); 
    
    CloseHandle(hfile); 
    
    ::SelectObject(memDC, hbmOld); 
    ::DeleteDC(memDC); 
    ::ReleaseDC(hWnd,hdc); 
    ::DeleteObject(hbm); 
    
    delete[] pbBits; 
    }
    

    Das Problem das ich habe: die erstellte Datei mit dem Screenshot ist 4MB groß.

    Wie mache ich den Screenshot so, dass er in eine kleine Datei gespeichert wird. Sprich wie beeinflusse ich die Dateigröße der bitmap....?

    Danke im Voraus!

    edurne



  • Ich würde mir eine Grafik-Lib organisieren und dann direkt ein jpg oder png draus machen.. also ein Bildformat mit Kompression...



  • du speicherst es als jpg(verlustbehaftet) oder png(verlustfrei).
    alternativ kannst du natürlich auch das bild einfach runterskalieren, oder den bereich, den du haben willst ausschneiden.



  • wie würde ich die Graphik herunterskalieren?



  • Zum Beispiel kannst du statt BitBlt StretchBlt benutzen (damit kannst du auch strecken/stauchen). Dann nimmst du versuchsweise einfach ein Viertel der Originalgröße (halbe Breite, halbe Höhe) und hast so eine deutlich kleinere Datei.

    EDIT: Aber wenn es nur um die Größer der Datei geht, ist eine Kompression vielleicht sinnvoller...



  • ok verstanden...und für die Kompression brauche ich extra libs richtig?


Anmelden zum Antworten