Pregunta

En una de mis preguntas anteriores, pregunté cómo tomar una captura de pantalla y guardarla como JPEG sin el uso de GDI + debido a las restricciones de tener que usar solo C. Al final, respondí la pregunta yo mismo con la ayuda de algunos de los comentarios allí. Usando una versión C muy concisa de GDI + (cargada en tiempo de ejecución) puedo tomar una captura de pantalla y guardarla como JPEG en un archivo. Ahora, ¿cómo guardaría esa misma captura de pantalla no en un archivo sino en un búfer? un buffer de char * sin signo? aquí está el código que debe convertirse.

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

Gracias por la ayuda.

¿Fue útil?

Solución

En lugar de llamar a GdipSaveImageToFile, debe usar GdipSaveImageToStream. Esto le permitirá guardar la imagen en una secuencia directamente, en lugar de escribirla en un archivo.

Consulte las funciones de imagen GDI para obtener más detalles.

Para crear un IStream en memoria, puede usar CreateStreamOnHGlobal . Esto tiene la opción de permitir que IStream asigne su propia memoria o use un búfer preasignado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top