VS2010-MFC:MFC PictureControl控件上自适应显示图片,分图片失真或者图片不失真两种

39 篇文章 4 订阅

MFC PictureControl控件上自适应显示图片,分图片失真或者图片不失真两种

 

ShowPicture(CString Filepath)
{
     /*----根据图片文件路径显示图片---------------------------------*/
	int height, width;
	CRect rect;//定义矩形类
	CRect rect1;
	CImage image; //创建图片类
	image.Load(Filepath);//加载图片
	height = image.GetHeight();//得到图片高度
	width = image.GetWidth();//得到图片宽度

	m_showPMT.GetClientRect(&rect); //获得pictrue控件所在的矩形区域,m_showPMT为与PictureControl相关联的控件变量
	CDC *pDc = m_showPMT.GetDC();//获得pictrue控件的Dc
	SetStretchBltMode(pDc->m_hDC,STRETCH_HALFTONE); 

	if(width<=rect.Width() && height<=rect.Width()) //如果图片的尺寸小于图片控件尺寸,则不缩放显示
	{
		rect1 = CRect(rect.TopLeft(), CSize(width,height));
		image.StretchBlt(pDc->m_hDC,rect1,SRCCOPY); //将图片画到Picture控件表示的矩形区域
	}
	else//如果图片的尺寸大于图片控件的尺寸
	{
		float xScale=(float)rect.Width()/(float)width;//求X方向的缩放因子
		float yScale=(float)rect.Height()/(float)height;//求Y方向的缩放因子
		//为了图片在图片控件上显示不失真,采用X和Y方向上较小的缩放因子作为缩放因子,此时图片不失真,但是可能不会铺满整个图片控件区域
		float ScaleIndex=(xScale<=yScale?xScale:yScale);
		//rect1 = CRect(rect.TopLeft(), CSize((int)width*xScale,(int)height*xScale));//此时图片失真,但是会铺满整个图片控件区域
		rect1 = CRect(rect.TopLeft(), CSize((int)width*ScaleIndex,(int)height*ScaleIndex));
		image.StretchBlt(pDc->m_hDC,rect1,SRCCOPY); //将图片画到Picture控件表示的矩形区域
	}
	ReleaseDC(pDc);//释放picture控件的Dc

}


图片失真,但是铺满整个图片控件区域:

 

 

 

图片不失真,但是没有铺满整个图片控件区域:

 

如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。

 

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HW140701

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值