BOOL GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0;
UINT size = 0;
GetImageEncodersSize(&num, &size);
if(size == 0)
return FALSE;
ImageCodecInfo* pImageCodecInfo = (ImageCodecInfo*)new BYTE[size];
if(pImageCodecInfo == NULL)
return FALSE;
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
{
*pClsid = pImageCodecInfo[j].Clsid;
delete pImageCodecInfo;
return TRUE;
}
}
delete pImageCodecInfo;
return FALSE;
}
BOOL GetEncoderClsName(LPCTSTR lpszFileName, LPTSTR lpszBuf, DWORD dwBufSize)
{
TCHAR* pFileExt = StrRChrW(lpszFileName, NULL, _T('.'));
if(NULL == pFileExt)
return FALSE;
_stprintf_s(lpszBuf, dwBufSize, _T("image/%s"), pFileExt + 1);
return TRUE;
}
// 支持的保存格式:BMP/TIFF/GIF/JPEG/PNG
BOOL SaveBmpToJpeg(HBITMAP hBmp, LPCTSTR lpszJpegFileName, ULONG quality = 100)
{
TCHAR sEncoderClsName[50] = {0};
if(!GetEncoderClsName(lpszJpegFileName, sEncoderClsName, 50))
return FALSE;
CLSID jpgClsid;
if(!GetEncoderClsid(sEncoderClsName, &jpgClsid))
return FALSE;
EncoderParameters encoderParameters;
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;
encoderParameters.Parameter[0].Value = &quality;
Gdiplus::Bitmap bmp(hBmp, NULL);
Status status = bmp.Save(lpszJpegFileName, &jpgClsid, &encoderParameters);
return (status != Ok);
}