gpt4 book ai didi

c - 将 JPEG 屏幕截图保存为 C 中的 BYTE 缓冲区

转载 作者:太空狗 更新时间:2023-10-29 15:37:12 41 4
gpt4 key购买 nike

在我之前的一个问题中,由于只能使用 C 的限制,我询问了如何在不使用 GDI+ 的情况下截取屏幕截图并将其保存为 JPEG。最后,我在一些评论的帮助下自己回答了这个问题。使用非常简洁的 C 版本的 GDI+(在运行时加载),我可以截取屏幕截图并将其作为 JPEG 格式保存到文件中。现在,我如何将相同的屏幕截图保存到缓冲区而不是文件?一个 unsigned 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;
}

感谢您的帮助。

最佳答案

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

参见 GDI image functions了解详情。

为了在内存中创建一个IStream,你可以使用CreateStreamOnHGlobal .这具有允许 IStream 分配自己的内存或使用预分配缓冲区的选项。

关于c - 将 JPEG 屏幕截图保存为 C 中的 BYTE 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1034680/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com