使用GDI 缩放图片文件 发布于:软件开发网 来源:互联网 作者:佚名 时间:2009-02-26 00:03
总结一下个人所知道的使用GDI 缩放图片的方法. 方法一:最简单的,使用GetThumbnailImage,这个方法的局限性对支持内嵌缩略图的图片文件无效.因为MSDN中提到:如果图片文件有内嵌的缩略图,那么就提取这个缩略图返回,否则就缩放原图片,不过我想对位图还是安全的:Bitmap *image=newBitmap(L"MagicLinux.bmp");Image*pScaledImage=NULL;UINTnWidth=image->GetWidth()/2;UINTnHeight=image->GetHeight()/2;pScaledImage=image->GetThumbnailImage(nWidth,nHeight,NULL,NULL);deletepScaledImage;deleteimage; 方法二,使用Graphics::DrawImage,这样还可以控制IntERPolationMode(插值模式,在缩放和旋转时候使用),即可以控制缩放质量高低.也可以通过Graphics对象做其他的控制.方法也比较简单,但是却费了我好久时间才研究出来,没办法,不熟悉GDI ,在MSDN中翻来翻去,:)Bitmap*ScaleBitmap(Bitmap*PBitmap,UINTnWidth,UINTnHeight){Bitmap*pTemp=newBitmap(nWidth,nHeight,pBitmap->GetPixelFormat());if(pTemp){Graphics*g=Graphics::FromImage(pTemp);if(g){//usethebestinterpolationmodeg->SetInterpolationMode(InterpolationModeHighQualityBicubic);g->DrawImage(pBitmap,0,0,nWidth,nHeight);deleteg;}
}
returnpTemp;}pScaledImage=ScaleBitmap(image,nWidth,nHeight);方法三,是从Codeguru上一个帖子上看到,和方法二类似,但是用了GDI的东东,我试了试,没成功,得到的是一幅黑图片,可能的原因是Bitmap::FromHBITMAP的第二个参数设置不对原文代码如下:Bitmap*bitmap=newBitmap(TempBuf);//CreatethebitmapHDCScreen=GetDC(WindowVars.Handle);piTemp->hdc=CreateCompatibleDC(Screen);//CreateamemoryDCHBITMAPhbitmap;if(bStretchPictures)hbitmap=CreateCompatibleBitmap(Screen,Size.X,Size.Y);elsehbitmap=CreateCompatibleBitmap(Screen,bitmap->GetWidth(),bitmap->GetHeight());SelectObject(piTemp->hdc,hbitmap);//InitializetheDCGraphics*graphics=newGraphics(piTemp->hdc);//CreatetheGraphicsclassif(bStretchPictures)graphics->DrawImage(bitmap,0,0,Size.X,Size.Y);//Drawthescaledimageelsegraphics->DrawImage(bitmap,0,0,bitmap->GetWidth(),bitmap->GetHeight());ReleaseDC(WindowVars.Handle,Screen);deletegraphics;deletebitmap;另外再补上保存图片的代码:
boolSaveAsImageFile(Image*pImage,LPCWSTRlpszFileName,LPCWSTRlpszImageType)
{UINT num=0;//numberofimageencodersUINT size=0;//sizeoftheimageencoderarrayinbytesImageCodecInfo*pImageCodecInfo=NULL;if(GetImageEncodersSize(&num,&size)!=Ok||size==0)returnfalse; //FailurepImageCodecInfo=(ImageCodecInfo*)(malloc(size));if(pImageCodecInfo==NULL)returnfalse; //Failureif(GetImageEncoders(num,size,pImageCodecInfo)!=Ok)returnfalse;boolbOk=false;for(UINTj=0;j{if(wcscmp(pImageCodecInfo[j].MimeType,lpszImageType)==0){pImage->Save(lpszFileName,&(pImageCodecInfo[j].Clsid));bOk=true;break;
}
}free(pImageCodecInfo);returnbOk;}调用象这样就可以保存成各种图片(当然要求有对应的encoder才行):SaveAsImageFile(pScaledImage,L"1.bmp",L"image/bmp");SaveAsImageFile(pScaledImage,L"1.jpg",L"image/jpeg");SaveAsImageFile(pScaledImage,L"1.png",L"image/png");方法四:?最后一个不错的GDI FAQsite:http://www.bobpowell.net/faqmain.htmeXMexiaomou@gmail.com