BMP in PNG



  • Ich hole mir mit folgendem Code einen Screenshot und täte diesen nun gerne als PNG speichern. Wie muss ich vorgehen.(Einach BI_PNG benutzen geht ja nicht.)

    #include<windows.h>
    
    int main()
    {
    int     nWidth  = GetSystemMetrics(SM_CXSCREEN);
    int     nHeight = GetSystemMetrics(SM_CYSCREEN);
    
    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     = 16;
    bmi.bmiHeader.biPlanes       = 1;
    bmi.bmiHeader.biCompression  = BI_RGB;
    bmi.bmiHeader.biSizeImage    = nWidth * nHeight * bmi.bmiHeader.biBitCount/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);
    
    HANDLE hfile = CreateFile( TEXT("c:\\screen.png"),
                               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;
    }
    

    Ps: Bin mit WinAPi noch nicht so der Held



  • GDI+ kann z.B. png speichern



  • Danke erstmals.

    Dann noch zwei fragen:

    1. wie mache ich das mit gdi+?

    2. wie kann ich png dateien wieder in bmp konvertieren?



  • Speichern als png ist sogar als 'Example' in der msdn:
    http://msdn2.microsoft.com/en-us/library/ms535407.aspx

    Bilddateien öffnen kann man z.B. mittels Bitmap.FromFile() (erkennt z.B. bmp, jpg, png, gif)
    Im C++-Magazin (siehe Forum hier unten) gibt es auch noch nen Artikel über GDI+

    Einfach mal ein wenig in der msdn stöbern:
    http://msdn2.microsoft.com/en-us/library/ms533798.aspx


Anmelden zum Antworten