实现代码如下:
int CGDIPSDIView::GetEncoderClsid( const WCHAR* format, CLSID* pClsid ) //GDI+取得不同类型图片编码类型的函数
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}
void CGDIPSDIView::GetGDIPBitMap( ) //测试函数
{
CDC* pdc = GetDC( ); CRect RT; GetClientRect( &RT ); //取得屏幕DC(你绘图的那个DC)及绘图区域
CDC memdc; memdc.CreateCompatibleDC( pdc ); //创建内存DC
CBitmap membmp; membmp.CreateCompatibleBitmap( pdc, RT.Width( ), RT.Height( ) ); //创建内存位图
memdc.SelectObject( &membmp ); //DC与位图勾连
memdc.BitBlt( 0,0, RT.Width( ), RT.Height( ), pdc, 0, 0, SRCCOPY ); //将屏幕DC(你绘图的那个DC)内容拷贝到内存DC当中,相当与将你的绘图拷贝到了membmp上。
Bitmap gBitMap( ( HBITMAP )membmp.m_hObject, NULL ); //创建通过构造函数或者通过FromHBITMAP函数创建一个Bitmap,注意它和Image的区别,一般不用Image,Image功能太少,是Bitmap的基类
CLSID bmpClsid;
GetEncoderClsid(L"image/bmp", &bmpClsid);
//设置编码参数
ULONG encoderQuality = 50; //压缩比例
EncoderParameters encoderParameters;
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;
encoderParameters.Parameter[0].Value = &encoderQuality;
gBitMap.Save(L"c:\\1.bmp", &bmpClsid, encoderParameters); //保存成bmp
CLSID pngid;
GetEncoderClsid(L"image/png", &pngid);
Status status = gBitMap.Save(L"c:\\1.png",&pngid,NULL); //保存成png
membmp.DeleteObject( );
memdc.DeleteDC( );
}