由于使用CImage将图像转换成JPG后品质严重受损,如果使用第三方库程序体积会很大,所以使用GDI+是最合适的选择。下面的代码示例了将位图格式的图像转换成不同品质的JPG格式,注意在使用之前要初始化GDI+库。 HRESULT SaveImage(BITMAPINFO *pbi, void *pBits, LPCTSTR pszFileName, LONG lQuality) { ASSERT(pbi!=NULL && pBits!=NULL); ASSERT(pszFileName!=NULL); if (pbi==NULL || pBits==NULL || pszFileName==NULL) return E_FAIL; GUID guidImageFormat=Gdiplus::ImageFormatJPEG; Gdiplus::EncoderParameters eps; eps.Count=1; eps.Parameter[0].Guid=Gdiplus::EncoderQuality; eps.Parameter[0].NumberOfValues=1; eps.Parameter[0].Type=Gdiplus::EncoderParameterValueTypeLong; eps.Parameter[0].Value=&lQuality; UINT nEncoders; UINT nBytes; Gdiplus::Status status; status = Gdiplus::GetImageEncodersSize( &nEncoders, &nBytes ); if( status != Gdiplus::Ok ) { return (E_FAIL); } USES_CONVERSION_EX; Gdiplus::ImageCodecInfo* pEncoders = static_cast< Gdiplus::ImageCodecInfo* >( _ATL_SAFE_ALLOCA(nBytes, _ATL_SAFE_ALLOCA_DEF_THRESHOLD) ); status = Gdiplus::GetImageEncoders( nEncoders, nBytes, pEncoders ); if( status != Gdiplus::Ok ) { return( E_FAIL ); } CLSID clsidEncoder = CLSID_NULL; // Determine clsid from file type for (UINT iCodec = 0; iCodec < nEncoders; iCodec++) { if (pEncoders[iCodec].FormatID==guidImageFormat) { clsidEncoder=pEncoders[iCodec].Clsid; break; } } if( clsidEncoder == CLSID_NULL ) { return( E_FAIL ); } LPCWSTR pwszFileName = T2CW_EX( pszFileName, _ATL_SAFE_ALLOCA_DEF_THRESHOLD ); Gdiplus::Bitmap bm(pbi,pBits); status = bm.Save( pwszFileName, &clsidEncoder, &eps ); if( status != Gdiplus::Ok ) { return( E_FAIL ); } return S_OK; }