Domanda

In una delle mie precedenti domande ho chiesto come fare uno screenshot e salvarlo come JPEG senza l'uso di GDI + a causa dei vincoli di dover usare solo C. Alla fine ho risposto alla domanda da solo con l'aiuto di alcuni dei commenti lì. Utilizzando una versione C molto ridotta di GDI + (caricata in fase di esecuzione), posso fare uno screenshot e salvarlo come JPEG in un file. Ora, come potrei salvare lo stesso screenshot non in un file ma in un buffer? un buffer char * senza segno? ecco il codice che deve essere convertito.

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

Grazie per l'aiuto.

È stato utile?

Soluzione

Invece di chiamare GdipSaveImageToFile, dovresti usare GdipSaveImageToStream. Questo ti permetterà di salvare l'immagine direttamente in uno stream, invece di scriverla in un file.

Vedi Funzioni immagine GDI per dettagli.

Per creare un IStream in memoria, è possibile utilizzare CreateStreamOnHGlobal . Ciò ha la possibilità di consentire a IStream di allocare la propria memoria o di utilizzare un buffer pre-allocato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top