在我以前的一个问题中,我问过如何拍摄截图并将其保存为JPEG而不使用GDI +,因为必须只使用C的限制。 最后,我在那里的一些评论的帮助下自己回答了这个问题。 使用非常简洁的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;
}
感谢您的帮助。
答案 0 :(得分:3)
您应该使用GdipSaveImageToStream,而不是调用GdipSaveImageToFile。这样可以直接将图像保存到流中,而不是将其写入文件。
有关详细信息,请参阅GDI image functions。
要在内存中创建IStream,您可以使用CreateStreamOnHGlobal。这可以选择允许IStream分配自己的内存,或使用预先分配的缓冲区。