【问题标题】:Saving JPEG screenshot as a BYTE buffer in C将 JPEG 屏幕截图保存为 C 中的 BYTE 缓冲区
【发布时间】:2009-06-23 19:33:08
【问题描述】:

在我之前的一个问题中,我询问了如何在不使用 GDI+ 的情况下截取屏幕截图并将其保存为 JPEG,因为只能使用 C。 最后,我在那里的一些 cmets 的帮助下自己回答了这个问题。 使用非常简洁的 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;
}

感谢您的帮助。

【问题讨论】:

    标签: c gdi+ byte


    【解决方案1】:

    您应该使用 GdipSaveImageToStream,而不是调用 GdipSaveImageToFile。这将允许您将图像直接保存到流中,而不是将其写入文件。

    详情请参阅GDI image functions

    为了在内存中创建 IStream,您可以使用CreateStreamOnHGlobal。这可以选择允许 IStream 分配自己的内存,或使用预先分配的缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多