用" GDI+ 图片缩放" 或者类似的关键字, 谷歌之, 看见的都是类似的结果. 可惜这些几乎一样的文章都有点小问题.
以下是摘录:
--------------------------------------------
方法二 , 使用 Graphics::DrawImage, 这样还可以控制 IntERP olationMode( 插值模式 , 在缩放和旋转时候使用 ), 即可以控制缩放质量高低 . 也可以通过 Graphics 对象做其他的控制 .
方法也比较简单 , 但是却费了我好久时间才研究出来 , 没办法 , 不熟悉 GDI+, 在 MSDN 中翻来翻去 ,:)
Bitmap * ScaleBitmap(Bitmap * PB itmap,UINT nWidth,UINT nHeight)
{
Bitmap * pTemp = new Bitmap(nWidth,nHeight,pBitmap->GetPixelFormat());
if( pTemp )
{
Graphics * g = Graphics::FromImage(pTemp);
if( g )
{
// use the best interpolation mode
g->SetInterpolationMode(InterpolationModeHighQualityBicubic);
g->DrawImage(pBitmap,0,0,nWidth,nHeight);
delete g;
}
}
return pTemp;
}
pScaledImage = ScaleBitmap(image,nWidth,nHeight);
---------------------------
不知道这文章的原作者是谁, 但这样写是有瑕疵的, 试过就知道这样做实际效果是裁切一部分图像 , 不是缩放 !
其实只要做点小小改动就可以了:
// 自己添加一个缩放框, DrawImage需要这参数
Rect destRect(0, 0, nWidth, nHeight);
// 这里设定缩放的模式为高质量
g->SetInterpolationMode(InterpolationModeHighQualityBicubic);
// 这个重载函数才是缩放, 注意参数比上面裁切代码参数有不同.
g->DrawImage(&image,
destRect,
0,
0,
nWidth,
nHeight,
UnitPixel);
其实这都是GDI+ SDK中就说明了的, 可能有人把示例中裁切代码错当成了缩放, 两者是有点相似. 大部分GDI+的用法和示例都可以在SDK参考上找到, 只是最好动手试下.
另附:
GDI+ SDK参考(翻译版本) 由 sTeVes 提供, 无需资源分下载
http://download.csdn.net/source/260557