Question

Lors d'une de mes précédentes questions, je vous ai demandé comment prendre une capture d'écran et la sauvegarder au format JPEG sans utiliser GDI +, en raison des contraintes liées à l'utilisation de C uniquement. À la fin, j'ai moi-même répondu à la question à l'aide de certains commentaires. En utilisant une version C très concise de GDI + (chargée au moment de l'exécution), je peux prendre une capture d'écran et la sauvegarder au format JPEG dans un fichier. Maintenant, comment pourrais-je sauvegarder cette même capture d'écran non pas dans un fichier mais dans un tampon? un char * buffer non signé? voici le code qui doit être converti.

int SaveJpeg(HBITMAP hBmp, LPCWSTR lpszFilename, ULONG uQuality)
{
    ULONG *pBitmap = NULL;
    CLSID imageCLSID;
    EncoderParameters encoderParams;
    int iRes = 0;

    typedef Status (WINAPI *pGdipCreateBitmapFromHBITMAP)(HBITMAP, HPALETTE, ULONG**);
    pGdipCreateBitmapFromHBITMAP lGdipCreateBitmapFromHBITMAP;

    typedef Status (WINAPI *pGdipSaveImageToFile)(ULONG *, const WCHAR*, const CLSID*, const EncoderParameters*);
    pGdipSaveImageToFile lGdipSaveImageToFile;

    // load GdipCreateBitmapFromHBITMAP
    lGdipCreateBitmapFromHBITMAP = (pGdipCreateBitmapFromHBITMAP)GetProcAddress(hModuleThread, "GdipCreateBitmapFromHBITMAP");
    if(lGdipCreateBitmapFromHBITMAP == NULL)
    {
        // error
        return 0;
    }

    // load GdipSaveImageToFile
    lGdipSaveImageToFile = (pGdipSaveImageToFile)GetProcAddress(hModuleThread, "GdipSaveImageToFile");
    if(lGdipSaveImageToFile == NULL)
    {
        // error
        return 0;
    }

        lGdipCreateBitmapFromHBITMAP(hBmp, NULL, &pBitmap);

       iRes = GetEncoderClsid(L"image/jpeg", &imageCLSID);
       if(iRes == -1)
    {
        // error
        return 0;
    }
    encoderParams.Count = 1;
    encoderParams.Parameter[0].NumberOfValues = 1;
    encoderParams.Parameter[0].Guid  = EncoderQuality;
    encoderParams.Parameter[0].Type  = EncoderParameterValueTypeLong;
    encoderParams.Parameter[0].Value = &uQuality;

    lGdipSaveImageToFile(pBitmap, lpszFilename, &imageCLSID, &encoderParams);


    return 1;
}

Merci pour l'aide.

Était-ce utile?

La solution

Au lieu d'appeler GdipSaveImageToFile, vous devez utiliser GdipSaveImageToStream. Cela vous permettra d’enregistrer directement l’image dans un flux au lieu de l’écrire dans un fichier.

Voir les fonctions de l’image GDI pour plus de détails.

Pour créer un flux IStream en mémoire, vous pouvez utiliser CreateStreamOnHGlobal . Cela a la possibilité de permettre à IStream d’allouer sa propre mémoire ou d’utiliser un tampon préalloué.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top