长青海世界周边是坟地:使用GDI 缩放图片文件

来源:百度文库 编辑:偶看新闻 时间:2024/05/06 12:48:22
使用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)

{

//usethebestinterpolationmode

g->SetInterpolationMode(InterpolationModeHighQualityBicubic);

g->DrawImage(pBitmap,0,0,nWidth,nHeight);

deleteg;

}}

returnpTemp;

}

pScaledImage=ScaleBitmap(image,nWidth,nHeight);

方法三,是从Codeguru上一个帖子上看到,和方法二类似,但是用了GDI的东东,我试了试,没成功,得到的是一幅黑图片,可能的原因是Bitmap::FromHBITMAP的第二个参数设置不对

原文代码如下:

Bitmap*bitmap=newBitmap(TempBuf);//Createthebitmap

HDCScreen=GetDC(WindowVars.Handle);

piTemp->hdc=CreateCompatibleDC(Screen);//CreateamemoryDC

HBITMAPhbitmap;

if(bStretchPictures)

hbitmap=CreateCompatibleBitmap(Screen,Size.X,Size.Y);

else

hbitmap=CreateCompatibleBitmap(Screen,bitmap->GetWidth(),bitmap->GetHeight());

SelectObject(piTemp->hdc,hbitmap);//InitializetheDC

Graphics*graphics=newGraphics(piTemp->hdc);//CreatetheGraphicsclass

if(bStretchPictures)

graphics->DrawImage(bitmap,0,0,Size.X,Size.Y);//Drawthescaledimage

else

graphics->DrawImage(bitmap,0,0,bitmap->GetWidth(),bitmap->GetHeight());

ReleaseDC(WindowVars.Handle,Screen);

deletegraphics;

deletebitmap;

另外再补上保存图片的代码:boolSaveAsImageFile(Image*pImage,LPCWSTRlpszFileName,LPCWSTRlpszImageType)

{

UINT num=0;

//numberofimageencoders

UINT size=0;

//sizeoftheimageencoderarrayinbytes

ImageCodecInfo*pImageCodecInfo=NULL;

if(GetImageEncodersSize(&num,&size)!=Ok||size==0)

returnfalse; //Failure

pImageCodecInfo=(ImageCodecInfo*)(malloc(size));

if(pImageCodecInfo==NULL)

returnfalse; //Failure

if(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.htm

eXMexiaomou@gmail.com