Gdiplus::Bitmap * pBitmap = new Gdiplus::Bitmap(320, 240, 320*4,
PixelFormat32bppRGB, pOutBuffer);
Gdiplus::Bitmap* pbm=NULL;
IStream *inf=NULL;
CreateStreamOnHGlobal(NULL, TRUE, &inf);
if(inf)
{
CLSID clsidEncoder;
USHORT uQuality = 75;
EncoderParameters encoderParams;
encoderParams.Count = 1;
encoderParams.Parameter[0].NumberOfValues = 1;
encoderParams.Parameter[0].Guid = EncoderQuality;
encoderParams.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParams.Parameter[0].Value = &uQuality;
GetEncoderClsid(L"image/jpg", &clsidEncoder);
if(Gdiplus::Ok==pBitmap->Save(inf, &clsidEncoder))
pbm=Gdiplus::Bitmap::FromStream(inf);
inf->Release();
pbm->Save(L"C:\\pucture.jpg",&clsidEncoder,&encoderParams);
}
if(pbm && pbm->GetLastStatus()!=Gdiplus::Ok)
{
delete pbm;
pbm=NULL;
}
int GetEncoderClsid(WCHAR *format, CLSID *pClsid)
{
unsigned int num = 0, size = 0;
GetImageEncodersSize(&num, &size); //HERE FILTER CRASHS
if(size == 0) return -1;
ImageCodecInfo *pImageCodecInfo = (ImageCodecInfo *)(malloc(size));
if(pImageCodecInfo == NULL) return -1;
GetImageEncoders(num, size, pImageCodecInfo);
for(unsigned int j = 0; j < num; ++j){
if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0){
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j;
}
}
free(pImageCodecInfo);
return -1;
}