Сохранение скриншота JPEG в виде буфера BYTE в C - PullRequest
4 голосов
/ 23 июня 2009

В одном из моих предыдущих вопросов я спросил, как сделать снимок экрана и сохранить его в формате JPEG без использования GDI + из-за ограничений использования только C. В конце я сам ответил на вопрос с помощью некоторых комментариев. Используя очень краткую C-версию GDI + (загруженную во время выполнения), я могу сделать снимок экрана и сохранить его в формате JPEG в файл. Теперь, как мне сохранить тот же скриншот не в файл, а в буфер? неподписанный буфер char *? Вот код, который необходимо преобразовать.

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

Спасибо за помощь.

1 Ответ

3 голосов
/ 23 июня 2009

Вместо вызова GdipSaveImageToFile, вы должны использовать GdipSaveImageToStream. Это позволит вам сохранить изображение в поток напрямую, а не записывать его в файл.

Подробнее см. Функции GDI-изображения .

Чтобы создать IStream в памяти, вы можете использовать CreateStreamOnHGlobal . У него есть возможность позволить IStream выделять свою собственную память или использовать предварительно выделенный буфер.

...