oS5j6Pi8 2019-9-21
zz123 2019-8-27
特发性震颤001 2019-8-16
※设为首页※
※收藏网站※
【用户登录】【用户注册】【在线反馈】【问你首页】
热门问答: 手机 奥运会 考试 美国 地震 计划 天气
∏百科知识网关于“I”的类似问题
·ic电表破解 (必看)sd
·imessage用户批量识别(必看)
·ic芯片银行解码器(必看)sd
·diy信息发射器(必看)sd
·imessage推信代发(必看)sd
·imessage推信源码(必看)sd
·最新imessage推信(必看)sd
·最新银行ic卡克隆器(必看)sd
·银行克隆ic卡设备哪里买(必看)sd
·银行克隆ic卡器(必看)sd
·银行ic卡解密工具(必看)sd
·银行ic卡解码复制器原理(必看)sd
相关问题
·有什么创意型的企业定制礼品?
·公司需要定制送客户的礼品,有
·企业商务往来,员工福利,促销
·有人做过定制礼品吗?企业定制
·企业给客户送什么礼物好呢?既
·给客户送什么礼物好?很重要的
相关知识
·重庆同济整形美容医院网站上线
·岁月如梭,我们慢慢淹没在历史
·爱情是什么,爱情是个X?
·分享下大家SEO的工作时间分
·tina的世界是什么样的?
·有不良信用记录可以申请信用卡
技术编程 更多..  
·天宫神八组合体16日…(11-16)
·刘翔复出跑出13秒1…(9-21)
·《建国大业》冲击票房…(9-18)
·两岁网球天才成英国新…(9-17)
·网易《魔兽世界》开服…(9-17)
·中国7月增持241亿…(9-17)
技术资讯 更多..  
·Win2003主机播…(7-9)
·使用无线路由器建设无…(7-5)
·一些无线猫的问题!(7-5)
·中国名牌与中国驰名商…(12-28)
·购买双色球选号秘诀(11-8)
·帮你吹散卫浴市场迷雾…(9-30)
用户积分排行榜 积 分
1 贾博浩 [状元] 134786
2 qq9060082是 [榜眼] 85094
3 yang999 [探花] 64572
4 yang989 51614
5 yang987 40878
6 草泥巴巴 27688
7 熊猫 21672
8 nangka01 18930
9 yang9898 13978
  
问题人气排行榜 浏览次数
1 超级QQ怎么用手机修 7133
2 淘宝规则频道左侧栏目 6335
3 游戏天龙八部中丐帮, 5515
4 插在电脑上的耳机一个 4277
5 二十四节气是怎么来的 4155
  
  信息阅读 收藏本页 我要提问 返回首页
使用GDI+缩放图片文件的方法
浏览次数:1294次 知识来源:未知 发布时间:2008-9-3 贡献人:问题达人

总结一下个人所知道的使用GDI+缩放图片的方法.

 

方法一:最简单的,使用GetThumbnailImage,这个方法的局限性对支持内嵌缩略图的图片文件无效. 因为MSDN中提到:如果图片文件有内嵌的缩略图,那么就提取这个缩略图返回,否则就缩放原图片,不过我想对位图还是安全的:

Bitmap  * image = new Bitmap(L"MagicLinux.bmp");

Image* pScaledImage = NULL;

UINT nWidth = image->GetWidth()/2;

UINT nHeight= image->GetHeight()/2;

pScaledImage = image->GetThumbnailImage(nWidth, nHeight, NULL, NULL);

delete pScaledImage;

delete image;

 

方法二,使用Graphics::DrawImage,这样还可以控制InterpolationMode(插值模式,在缩放和旋转时候使用),即可以控制缩放质量高低.也可以通过Graphics对象做其他的控制.

方法也比较简单,但是却费了我好久时间才研究出来,没办法,不熟悉GDI+,MSDN中翻来翻去,:)

Bitmap * ScaleBitmap(Bitmap * pBitmap,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);

 

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

原文代码如下:

Bitmap * bitmap = new Bitmap(TempBuf); // Create the bitmap

HDC Screen = GetDC(WindowVars.Handle);

piTemp->hdc = CreateCompatibleDC(Screen); // Create a memory DC

HBITMAP hbitmap;

if (bStretchPictures)

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

else

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

SelectObject(piTemp->hdc, hbitmap); // Initialize the DC

Graphics * graphics = new Graphics(piTemp->hdc); // Create the Graphics class

if (bStretchPictures)

graphics->DrawImage(bitmap, 0, 0, Size.X, Size.Y); // Draw the scaled image

else

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

ReleaseDC(WindowVars.Handle, Screen);

delete graphics;

delete bitmap;

 

 

另外再补上保存图片的代码:

 

bool SaveAsImageFile(Image * pImage,LPCWSTR lpszFileName,LPCWSTR lpszImageType)

{

 

UINT  num = 0;

 

// number of image encoders

UINT  size = 0;

 

// size of the image encoder array in bytes

ImageCodecInfo* pImageCodecInfo = NULL;

 

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

return false;  // Failure

 

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

if(pImageCodecInfo == NULL)

return false;  // Failure

 

if(GetImageEncoders(num, size, pImageCodecInfo)!= Ok )

return false;

 

bool bOk = false;

for(UINT j = 0; j < num; ++j)

{

if( wcscmp(pImageCodecInfo[j].MimeType, lpszImageType) == 0 )

{

pImage->Save(lpszFileName,&(pImageCodecInfo[j].Clsid));

bOk = true;

break;

}

 

}

 

free(pImageCodecInfo);

return bOk;

 

}

 

调用象这样就可以保存成各种图片(当然要求有对应的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+缩放图片文件的方法

∏百科知识网关于“I”的类似知识
·tina的世界是什么样的?
·DIY装机,求高手指点(硬件兼容性和性能)
·听朋友说营口的西铁城citizen手表不错,快来给点意见吧。
·windows 7家庭普通版怎么装无线路由器
·什么是IPO、创业板、中小板?
·linux系统下文件权限的基础知识
·英文吵架100句!English!
·Apache+php+mysql在windows下的安装与配置图解(最新版)
·最近热门什么是三聚氰胺(英文名Melamine)
·IIS服务器排错指南及错误代码大全
·使用GDI+缩放图片文件的方法
·一些你可能没有注意到的Windows XP使用技巧
Copyright By weniwa.com(问你哇)©2008- 2018 All Rights Reserved.
[问你哇(Ask You Wa)知识问答网]问答改变生活—特别合作伙伴和网站赞助:链接平台
客服QQ:982182402 客服Email:weniwa@qq.com 知识问答网-问 答改变生活,知识改变命运!
哇,问你哇,知识问答网,六年问答与您相伴
www.weniwa.com
渝ICP备08004120-1号