| 后一页 前一页 回目录 回首页 |
●海南大学 叶斗彪 摘 要:为图象观察器增加一个“放大镜”,对图象进行局部放大,是产品推销商和动物解剖学师生们梦寐以求的。本文介绍实现图象局部、平滑和无闪烁放大的算法原理及实现技术。关键词:放大镜 画布 Delphi CopyRect
目前,有许多流行的图象观察软件和图象处理软件,为人们在电脑屏幕上浏览和加工美丽的图象提供了方便。然而遗憾的是,这些软件在图象放大方面却不尽如人意。它们往往只能对整幅图象进行放大,而不能随意地放大图象的局部,就连微软公司随 Windows提供的画图软件也不例外。对图象局部进行放大,具有极高的实用价值。产品推销商可以将此项技术应用于新产品的展示和推广之中,让用户能够对其产品的不同部位,如汽车的表面镀铬工艺和新型的挡风玻璃等进行放大观看。通过电脑网络上动物解剖课的学生,亦可用其放大小白鼠或是青蛙的不同部位,以便更清晰地观察血管和各种器官。就象在日常生活中,人们手持放大镜,在地图或照片上移动的情景! 本文介绍实现图象局部、平滑和无闪烁放大的算法原理,以及在 Delphi中实现的技术。读完本文,您一定会为Delphi能用如此少的代码实现如此强大的功能惊叹不已,这是许多其它开发工具所无法比拟的。在Delphi中,可利用类Tcanvas的CopyRect方法实现图象的放大和缩小。其功能是将源画布上的一个指定矩形区域(简称源矩形)内的象素,拷贝到目的画布上的一个指定矩形区域(简称目的矩形)中。亦可称之为象素块复制,如图1所示。 由CopyMode属性确定拷贝的模式。在直接拷贝模式(cmSrcCopy)下,当源矩形与目的矩形相等时,图象不变;若源矩形大于目的矩形,图象则缩小;而当源矩形小于目的矩形时,图象便被放大(在目的矩形中扩展)。源矩形与目的矩形大小之比,决定图象的缩放倍数。CopyRect方法声明如下: Procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: Trect); 其中参数,Dest为目的矩形,Canvas是源画布,Source为源矩形。
主窗体和各组件的主要属性按表 1设置:表1 主窗体和各组件属性设置
上述各组件的许多属性,读者亦可根据个人的爱好设定。 const sSide=30; dSide=45; var msHide: Boolean; OldX, OldY, NewX, NewY: Integer; DestRect, SourceRect : TRect; 其中,常量sSide和dSide用以控制“放大镜”的大小和放大倍数;变量msHide控制光标(鼠标)的隐藏和打开;其它变量用以确定放大部位。 msHide:=True; Canvas.CopyMode:=cmSrcCopy; procedure TMainForm.ImageCopy(BoxCenterX, BoxCenterY, BoxSide: Integer); begin with SourceRect do begin Left:=BoxCenterX-BoxSide; Top:=BoxCenterY-BoxSide; Right:=BoxCenterX+BoxSide; Bottom:=BoxCenterY+BoxSide; end; with DestRect do begin Left:=BoxCenterX-dSide; Top:=BoxCenterY-dSide; Right:=BoxCenterX+dSide; Bottom:=BoxCenterY+dSide; end; ForeImage.Canvas.CopyRect(DestRect, BackImage.Canvas, SourceRect); end; 注意,别忘了在Main.pas的“type”中声明过程ImageCopy。 NewX:=X; NewY:=Y; if msHide then begin OldX:=NewX; OldY:=NewY; msHide:=False; ShowCursor(False); end else begin ImageCopy(OldX, OldY, dSide); end; ImageCopy(NewX, NewY, sSide); OldX:=NewX; OldY:=NewY; if not msHide then begin msHide:=True; ShowCursor(True); ImageCopy(OldX, OldY, dSide); end; 至此,已不再需要做更多的事情,立即编译运行吧。啊,美丽的照片出现在屏幕中央!试试放大效果。将鼠标徐徐移入相框,奇迹出现了,鼠标变成了“放大镜”,所到之处,图象的相应部位被放大,十分平滑,毫无闪烁。这不是同您手持放大镜,观看地图和照片的情景一样吗。好酷啊!还有什么能比这更激动人心的呢?! 以上介绍了利用了画布的CopyRect方法,将图象以象素块从后台隐藏的TImage组件画布上向前台TImage组件的画布上拷贝,以实现图象的放大与恢复的技术。由于这一技术的采用,在图象放大前不需要存储象素,此后直接从后台TImage组件画布上恢复图象。不仅节省了内存资源,也确保了对图象的局部进行平滑、无闪烁地放大。同时,程序源代码也简洁、明了。 “放大镜”的中心便是鼠标的位置,这样处理的好处是使得图象在“放大镜”中均匀展开,并确保图象边缘也能同样放大。 要改变“放大镜”的大小和图象的放大倍数,只需修改常量sSide和dSide的值。实际应用中,亦可灵活处置,如将它们设置成变量,由程序菜单控制。本例“放大镜”的大小为90*90个象素,放大倍数为1.5。值得一提的是,这里的“放大镜”比真正的玻璃放大镜的效果要好得多。玻璃放大镜是用凸透镜制成的,中间与边缘的放大倍数不一致,导致图象发生形变。而且,当一边移动一边观察时,很容易使人眼花缭乱。本文为您展示的“放大镜”则没有这些现象。 利用TCanvas的StretchDraw方法或其它方法,也可以实现图象的局部放大。另外,虽然本文介绍的算法已经相当令人满意,但还是可以作进一步修改的。例如在“放大镜”移动时,只放大和恢复必要的部分。有兴趣的读者不妨一试。 程序编译、运行环境为Delphi 3.0和中文Windows 98。
参考文献
|
后一页 前一页 回目录 回首页 |