MFC编程实例:MFC 对话框上RGB图像缩放,左键放大,右键缩小+滚动条使用
小职 2018-07-05 来源 : 阅读 4008 评论 0

摘要:本文主要向大家介绍了MFC编程实例:MFC 对话框上RGB图像缩放,左键放大,右键缩小+滚动条使用,通过具体的内容向大家展示,希望对大家学习MFC编程实例有所帮助。

    本文主要向大家介绍了MFC编程实例:MFC 对话框上RGB图像缩放,左键放大,右键缩小+滚动条使用,通过具体的内容向大家展示,希望对大家学习MFC编程实例有所帮助。

    大家知道,对于文档视图类来说,这样图像的缩放,视图框架就给我们做了,那么怎样在对话框做缩放呢?

     问题:将图像缩放到屏幕分辨率大小,及任意倍数的缩放方法

(1)如果缩放后的图像比显示屏的分辨率小,则隐藏对应的滚动条(ShowScrollBar);

(2)根据缩放比例,计算出要显示放大图片的大小;

(3)将滚动条的范围设置成0-100,根据缩放的size分成4档,显示屏分辨率size,1倍图像size,2倍图像size,1.5倍图像size。如果计算实际的size大于屏幕的分辨率,就可以根据它们的差值,计算出滚动条,每一格 滚动的像素个数;

(5)根据滚动条的变化,计算出在屏幕上要显示的对应的像素,然后刷新这部分像素;

(6)用Strecthblt()把原图放大贴到对话框上。
(7)当滚动条滚动获得滚动块位置,刷新,在ONPAINT()里改Strecthblt()里面源DC开始位置把图贴上来。

 

缩放算法:

(1)     双线性插值,必须支持yuv和rgb24位的缩放;

(2)     pDC->StretchBlt(paintRect.left, paintRect.top, paintRect.Width(), paintRect.Height(),  
  &dcMem, imgRect.left, imgRect.top, imgRect.Width(), imgRect.Height(), SRCCOPY);
CRect paintRect; //在CStatic上的哪个区域贴图。
CRect imgRect; //贴出图像的哪部分

缩放、移动都要重新得到正确的paintRect,imgRect,然后重画。

 

具体方法:

(1)     默认是缩放到屏幕的分辨率的size,然后点击鼠标左键放大到原始size,在点左键放大到1.5倍size,依次最大放大到2被size,点右键,依次缩小。在屏幕size时,隐藏滚动条;

(2)     如果缩放的图像size 大于屏幕的分辨率,那么就显示滚动条,默认滚动条在最左和最上,显示的图像是原始图像经放大的屏幕size部分,从坐标0开始显示;

(3)     此时拖动滚动条,重新计算原始的坐标和原始图像像素点的个数,然后将这部分像素放大到整个屏幕分辨率;每次拖动滚动条,要进行视频重画;StretchBlt;

(4)     这样考虑不要分配格外的空间。

 

默认paintRect.left=0;

paintRect.top=0;

paintRect.Width=int   cx   =   ::GetDeviceCaps(dc.m_hDC,HORZRES);

paintRect.Height=int   cy   =   ::GetDeviceCaps(dc.m_hDC,VERTRES);

 

贴出图像的哪部分:

imgRect :

根据放大的倍数和滚动条的位置,就算出原始图像的哪部分像素显示在屏幕上。

主要是计算出这个关系;

设滚动条的水平位置为sx,垂直位置为sy;

屏幕的size为:cx,cy

放大倍数为m_zoom;

那么此时:对应的原始像素的坐标为:

图像的像素size=i_width*i_height;

 

那么此时的局部原始size为(RGB缩放):

imgRect.left=(i_width-cx/m_zoom)*sx/100;

imgRect.top=(i_height-cy/m_zoom)*sy/100;

imgRect.width=cx/m_zoom;

imgRect.height=cy/m_zoom;

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程