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); }