使用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; }
相关文章推荐
- 总结:C# Bitmap保存的问题,eg:GDI+中发生一般性错误 .jpg 正由另一个进程使用 ,该进程无法访问文件
- vc6.0使用gdi+在内存中绘图并将其保存为bmp,jpg,gif,png等格式的图片
- vc6.0使用gdi+在内存中绘图并将其保存为bmp,jpg,gif,png等格式的图片
- C# Bitmap保存的问题,eg:GDI+中发生一般性错误 .jpg 正由另一个进程使用 ,该进程无法访问文件
- (原創) 如何使用C++/CLI读/写jpg檔? (.NET) (C++/CLI) (GDI+) (C/C++) (Image Processing)
- [WIN32]VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。
- VB60用 GDI+保存为JPG/TIFF/PNG/GIF/BMP等格式
- MFC 使用GDI+ 绘制Png、Jpg等类型图片
- 使用GDI+保存带Alpha通道的图像
- 使用开源jpeg库保存jpg图像
- 使用GDI+保存BITMAP到文件
- 使用libjpeg-turbo库中兼容的libjpeg库解压一张jpg并缩放压缩保存到文件
- 使用 Video4Linux 采集USB摄像头的图像,并保存到一张 jpg图像文件中的程序
- 使用GDI+保存用户的绘图数据.
- 使用Boost.Gil将BMP图片保存为JPG
- 在.net中使用GDI+来提高gif图片的保存画质
- 使用GDI+屏幕截图内存中压缩为jpg
- 使用GDI+提高gif图片的保存画质
- 使用gdi+的Image旋转图片并保存
- VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。