您的位置:首页 > 其它

使用GDI+保存带品质的JPG

2010-10-23 14:52 190 查看
由于使用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: