C++Builder 图像的几何放大 缩小 任意角度旋转

更新时间:2023-11-17 13:20:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C++Builder实现图像的 放大、缩小、任意角度旋转功能

学 号:090081001023

学生所在学院:信息工程学院

学 生 姓 名 : 吴 静

任 课 教 师 :熊 邦 书

教师所在学院:信息工程学院

2010年1月

09级研8班

实现图像的放大、缩小、任意角度旋转功能

吴静

信息工程学院

摘 要:本文介绍了C++程序设计在数字图像处理应用领域的简单运用及其重要意义,详细阐述

了利用C++Builder设计简单的图像处理软件的方法和步骤,实现了图像的任意倍数的放大、缩小、任意角度旋转功能。在此基础上,对数字图像处理的研究有了初步的了解,并且进一步熟悉了C++程序设计在实际应用中的一般方法和思想,为以后进一步的编程和对图像处理的研究打下了基础。

关键词:C++Builedr 放大 缩小 任意角度旋转

Abstract:This article describes the C++ programming in digital image processing

applicationsthe use and significance of a simple detailede the use of C++ Builder designed to be simple image processing software methods and steps to achieve an arbitrary multiple of the image to enlarge,reduceany angle rotation.On this basis,the study of digital image processing an initial understanding ofand further familiar wite C++ programmers in practical appliacation of the general methods and ideas for future programming and further image processing to lay the foundation for the study.

Keywords:C++ Builder enlarge reduce rotation at any angle

1 组件介绍

1.1 窗 体(Form)

窗体是人机交互的主要界面,窗体的界面设计是十分重要的,一个好的软件需要一个漂亮的窗体来衬托。窗体是最常用的容器组件,在面向对象程序设计中,我们都离不开窗体。

①Position属性:设置窗体的显示位置 ②窗体的显示属性

Color属性:设置窗体的颜色 Font属性:设置窗体的字体。 Enabled:设置窗体是否有效,设置为false则无法对窗体进行任何操作。 Hint属性:设置VCL控件的ShowHint属性的提示提示信息。(Button) Caption属性:设置窗体的标题名称 Name属性:用来识别组件的名称,这个与Caption没有绝对的关系,只是有些时候,一些程序员喜欢将Caption跟Name所使用的名称弄成相同的。不过严格说起来, Caption是显示出来给大家看的,而Name是用来在程序中辨别不同组件的。

WindowState属性:设置窗体的初始状态,取值为wsNormal(窗体设置时的大小),wsMaximized(最大化显示) ,wsMinimized(最小化显示) BorderStyle属性:设置窗体的类型。

bsDialog:窗体具有单线边框,大小不能改变,而且没有最小化及最大化按钮。 bsNone:窗体没有边框,也没有标题栏,边框的大小不能改变。 bsSingle:边框大小不可变的标准窗体,有最小化及最大化按钮。 bsSizable:边框大小可变的标准窗体,有最小化及最大化按钮。

bsSizeToolWin:风格与bsSizeable类似,只是标题栏比较小。没有最小化及最大化按钮,边框大小可变。 。

bsToolWindows:风格与bsSignle类似,只是标题栏比较小。选择该项时,没有最小化及最大化按钮,边框大小不可变。 ③Borderlcons属性 biSystemMenu:通过单击标题栏左边的图标,或在标题上单击鼠标右键来显示系统菜单。

biMinimize:在标题栏右边显示最小化按钮 biMaximize:在标题栏右边显示最大化按钮

biHelp:在标题栏右边显示帮助按钮。只有窗体的BorderStyle属性设置为bsDialog或者窗体属性BorderIcons中不包括biMaximize和bimMinize时,biHelp设置才有效。

1.2 标签组件(TLabel)

标签(TLabel)用于显示静态的、不需要修改的文本信息。标签组件常用作窗体中某

些没有Caption属性组件的标识说明,如文本编辑框、列表框、组合框等。

①控制标签中显示的文本

在标签组件中实际显示的文本是由Caption属性控制的,该属性可以在属性页中设置,或在执行程序时用代码标签组件中所显示的文本,以 适应不同用途的需要。 (Label1->Caption=\②标签大小自适应于文本

标签的大小由绘制时的大小确定,当然也可以通过Height、Width属性来确定。当标签的大小标签组件提供了可以随时改变组件尺寸、以便方便帮助用户适应较长或较短标题的两种属性AutoSize和WordWarp。属性AutoSize决定了组件是否可以自动改变尺寸,以适应其内容的变化。如:将该属性设为Ture,标签组件便会根据内容改变水平方向的尺寸。

1.3 TBitBtn组件

TBitBtn组件可以在按钮表面上显示位图(Bitmap)文件,还可以改变按钮上文字的颜色。该组件有以下几个特殊的属性:

①Kind属性。Kind属性决定了TBitBtn组件的种类。它是一个枚举型属性,取值可以是:bkCustom(自定义 )、bkOk、bkCancel、bkYes、bkNo、bkHelp、bkClose、bkAbort(中止 )、bkRetry(重试 )、bkIgnore和bkAll。每个取值都有明显的意义,同时使TBitBtn组件与一个特殊的位图对应,如右图所示,如果 用户自己指定位图,该属性要设置为bkCustom

(自定义 ),然后通过Glyph属性指定一个位图。 如果不想在按钮上显示文字,只要将按钮的 Caption属性清空。

②Glyph属性。通过Glyph属性可将指定的图形 显示在位图按钮上。

1.4文本编辑组件(Edit)

文本编辑组件(Edit)是C++Builder中使用最为频繁的组件之一,它是一个文本编辑区域,程序运行时可以用来输出、输入和编辑文本。文本编辑框的属性很多,有些属性是属于前面已经介绍的基本属性,还有一些属性将直接影响文本编辑框的应用。下面就介绍一下TEdit组件的Text属性

文本编辑框中重要的属性当属Text属性,该属性中存放了文本编辑框中显示的实际文本。Text属性有三种使用方法:

①在设计时属性窗口中设置文本编辑框初始显示的内容默认为Edit1。 ②在运行时通过代码设置或由用户直接输入:

Edit1->Text=“欢迎进入奇妙的C++Builder世界”; ③返回文本编辑框中当前内容。

当用户对文本编辑框中的内容进行输入、编辑修改后,可以用Text属性将当

前内容返回。例如:Label1->Caption=Edit1->Text; 1.5

TopenpictureDialog对话框组件

TOpenpictureDialog对话框组件用于打开图形文件,通过Execute打开相应的对话框。在TOpenpictureDialog对话框显示的时候,右侧多了一个可以预览的图形区域。如果选中的文件被组件所支持,则图形可以显示在预览区域。可以识别的文件有:位图(.bmp)、图标文件(.ico)、windows图元文件(.wmf)以及增强型图元文件( .emf)等。所包含的属性有Filter、 DefaultExt、FilterIndex、Title、 InitialDir、 Options、 Filename等属性。 ①Filename属性:

Filename属性返回用户最后选择的文件名,文件名中包含了文件所在的路径。如果在打开options属性中设置了ofAllowMultiSelect为ture,也就可以一次选择多个文件,否则通过读取Files->String[i]的值可以获取所有选中的文件名。 ②Execute方法

该方法用于显示打开对话框。一般程序为:OpenDialog1->Execute()。

2 界面设计

2.1 主窗体设计

图1 主窗体的设计

在窗体中添加一个Image控件、2个label控件、5个Button控件、1个Bitbtn控件,3个Edit控件、1个OpenpictureDialog控件、按照表1所示设置窗体中控件的属性,窗体的界面设计如图1所示。

表1 设置控件属性

控件名

Form1 Button1 Button2 Button3 Button4 Button5 Bitbtn1 Label1 Label2

属性名

Caption Caption Caption Caption Caption Caption Caption Caption Caption

设定值

图像几何变换 旋转 放大 缩小 原始大小 退出 浏览

输入旋转角度 输入缩放倍数

2.2主要功能界面的设计

2.2.1 打开图像

点击按钮 ,(此时界面上的旋转、放大、缩小、原始大小等按钮都是灰色不可用的)弹出一个选择图像的对话框,选择要浏览的图像,图像的路径会显示在Edit文本编辑框里。打开的图像会在主窗体中间显示,此时界面上的旋转你、放大、缩小、原始大小等按钮都是可用的。

2.2.2 图像的旋转

打开图像后在输入旋转角度后的文本编辑框内输入旋转的角度,输入旋转角度后点

击 就会实现图像以所输入角度的旋转如果没有输入旋转角度就会出现提示。 如右图:

2.2.3 图像的缩放

图像的缩放包括图像的放大和缩小,在输入缩放倍数后的文本编辑框内输入缩放的

倍数,点击 或者 就可以实现图像按照输入倍数的放大和缩小如

果没有输入缩放倍数就直接点击放大或者缩小按钮就会出现提示。如右图:

3 程序设计

3.1实现图像的打开

在窗体中加入TOpenpictureDialog对话框组件后,只要点击浏览按钮在此输入程序就可以实现图像的打开,主要打开图像的程序:OpenPictureDialog1->Execute() 3.2实现图像的旋转

实现图像旋转的算法原理:图像的旋转是以图像的中心为原点,旋转一定的角度。旋转后图像的大小一般会发生改变。图像的旋转既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所有的图像。如图1-3,点(x0,y0)经过旋转?度后坐标变成(x1,y1)。

图1-3 图像旋转示意图

在旋转前:

?x0??cos? (1-1) ??y0??sin?旋转后:

?x1??cos(???)??cos?cos???sin?sin??x0cos??y0sin? (1-2) ??y1??sin(???)??sin?cos???cos?sin???x0sin??y0cos?上图旋转是绕坐标轴原点(0,0)进行的,向右为X轴正方向,向上为Y轴正方向,设其为坐标系II,而屏幕中的坐标一般以左上角为原点,以向右为X轴正方向、向下为Y轴正方向,设其为坐标系I。如果是绕一个指定点(a,b)旋转,则要先将坐标系平移到该点,再进行旋转,然后平移回新的坐标原点。

下面是坐标系平移转换公式的推导。如图1-4所示,将坐标系I平移到坐标系II处,其中坐标系II的原点在坐标系I中的坐标为(a,b)。

图1-4 旋转中心平移示意图

设图像的宽度为w,高度为h,得到

?xII??1?yII???0?????1????0?0.5???xI??? (1-3) ?10.5h???yI?01????1??0其逆变换矩阵表达式为:

?xI??1?yI???0?????1????00.5???xII??yII? (1-4) ?10.5h??????01??1??0按如下方法即可旋转图像:

(1)根据公式1-3,将坐标系I变到坐标系II; (2)根据公式1-2,将该点顺时针旋转?角; (3)根据公式1-4,将坐标系II变到坐标系I。

假设图像在新的坐标系下,以旋转后新图像左上角为原点,未旋转时中心坐标为

(a,b),旋转后中心坐标为(c,d),则旋转变换矩阵表达式为:

?xI??1?yI???0?????1????00?10c??cos??d????sin?1?0???sin?cos?00??1?0???01????00?10?a??x0??? b???y0?1????1??因此,

?x1?x0cos??y0sin??c??y1?x0sin??y0cos??bsin??d

(1-5)

逆变换为:

?x0?x1cos??y1sin??ccos??dsin??a??y0??x1sin??y1cos??csin??dcos??b

(1-6)

这样,对于新图中的每一点,可以根据式1-6求出对应原图中的点,得到它的灰度,如果超出原图范围,则置成白色。设图像原始宽度为wide原始高度为height,旋转后应首先计算出公式中需要的几个参数。

如图1-4所示,原始图像4个角的坐标分别为:

offx1??(wide?1)/2,offy1?(height?1)/2offx2?(wide?1)/2,offy2?(height?1)/2offx3??(wide?1)/2,offy3??(height?1)/2offx4?(wide?1)/2,offy4??(height?1)/2

旋转后图像4个角的坐标分别为:

(nffx1,nffy1),(nffx2,nffy2),(nffx3,nffy3),(nffx4,nffy4)

按照旋转公式,在旋转后的新图中,这4个点的坐标为:

nffx1??(wide?1)cos?/2?(height?1)sin?/2nffy1?(wide?1)sin?/2?(height?1)cos?/2nffx2?(wide?1)cos?/2?(height?1)sin?/2nffy2??(wide?1)sin?/2?(height?1)cos?/2 nffx3?(wide?1)cos?/2?(height?1)sin?/2nffy3??(wide?1)sin?/2?(height?1)cos?/2nffx4??(wide?1)cos?/2?(height?1)sin?/2nffx4?(wide?1)sin?/2?(height?1)cos?/2则新图像的宽度newwide和高度newheight为:

newwide?max(nffx4?nffx1,nffx3?nffx2)newheight?max(nffy4?nffy1,nffy3?nffy2)

由图1-4可知,原图的中心坐标(a,b)在显示屏幕上的位置为:

a?(wide?1)/2,b?(height?1)/2

旋转后图像的中心坐标(c,d) 在显示屏幕上的位置为:

c?(newwide?1)/2,d?(newheight?1)/2

根据式1-6,设中间变量t1,t2,令:

?t1??ccos??dsin??a ??t2?csin??dcos??b所以

?t1??(newwide?1)cos?/2?(newheight?1)sin?/2?(wide?1)/2??t2?(newwide?1)sin?/2?(newheight?1)cos?/2?(height?1)/2

?x0?x1cos??y1sin??t1 ??y0?x1sin??y1cos??t2实现步骤:首先将角度化为弧度,获得原始图像的宽度和高度以及原图的三个点的坐标,经过旋转后得到新图三个点的坐标,并计算新图的宽度和高度,最后在原图范围内对像素点进行变换。 3.3 实现图像的放大和缩小

实现图像缩放的算法原理:假设图像X轴方向缩放比例是kx,Y轴方向缩放比例是,那么原图中点(x0,y0)对应新图中的(x1,y1)为:

?x1?x0?kx ?y1?y0?ky?(1)当kx>1且ky>1时,原图像被放大。由于放大图像时产生了新的像素,可通过插值法来近似处理。当kx=ky=2时,图像放大2倍,原图中的某一个像素,对应新图中的4个像素。如下图1-1所示。

(a)原图中的某个像素 (b)对应新图的4个像素

图1-1 图像放大示意图

(2) 当kx<1且ky<1时,原图像被缩小。例如,当kx=ky=0.5时,图像被缩到一半大小,原图中4个像素对应新图中1个像素。此时缩小后的图像中的(0,0)像素对应于原图中的(0,0) (0,1) (1,0) (1,1)像素,以此类推。在原图基础上,每行隔一个像素

本文来源:https://www.bwwdw.com/article/xj2v.html

Top