[C/C++] Screenshot als JPEG/TIFF speichern

Wenn ein halbwegs aktuelles Windows SDK installiert ist, sollte das kleine Beispiel ohne Probleme laufen.
C++:
#ifdef _WIN64
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;
#endif

#include <windows.h>
#include <gdiplus.h>
#include <string>
#pragma comment (lib, "gdiplus.lib")
 
int main()
{
    // Initialisierung (nur einmal im Programm)
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    // Irgendein Bmp zum Testen
    
    HBITMAP hbm = (HBITMAP)LoadImage( NULL,
                                      "C:\\test.bmp",
                                      IMAGE_BITMAP,
                                      0,
                                      0,
                                      LR_LOADFROMFILE );
                             
    Gdiplus::Bitmap* pBitmap = Gdiplus::Bitmap::FromHBITMAP(hbm, (HPALETTE)GetStockObject(DEFAULT_PALETTE));                             

    // Encoder ermitteln und speichern

    UINT nNum, nSize;
    Gdiplus::GetImageEncodersSize(&nNum, &nSize);

    Gdiplus::ImageCodecInfo* pImageCodecInfo = (Gdiplus::ImageCodecInfo *)new char[nSize];
    Gdiplus::GetImageEncoders(nNum, nSize, pImageCodecInfo);

    for( UINT i = 0; i < nNum; i++ )
    {
        std::wstring wstrMime = pImageCodecInfo[i].MimeType;

        if( wstrMime == L"image/jpeg" ) // oder image/gif, image/tiff, image/png, image/bmp
        {
            pBitmap->Save( L"C:\\test.jpg", &pImageCodecInfo[i].Clsid);
            break;
        }
    }

    delete pImageCodecInfo;
    delete pBitmap;
    DeleteObject(hbm);

    // Deinitialisierung
    Gdiplus::GdiplusShutdown(gdiplusToken);
    return 0;
}
Gruß
MCoder
 
Zurück