`
emowuyi
  • 浏览: 1474152 次
文章分类
社区版块
存档分类
最新评论

图形图像平面几何变换类(Delphi版)

 
阅读更多

有关图形图像的平面几何变换,现有的教程、计算机图书以及网上的资料上介绍理论的偏多,即使有些编程实例,也只是介绍图像几何变换的某些特例,如旋转、缩放、平移等。GDI+倒是有个Matrix类,可完整地实现图像的几何变换,可惜没法得到源码。

本文不准备介绍任何关于平面几何变换的理论或者原理,而是直接用Delphi实现一个图形图像平面几何类TTransformMatrix。(C++版请见:http://blog.csdn.net/maozefa/archive/2010/10/10/5931427.aspx

下面是TransformMatrix类的全部代码:

TTransformMatrix与GDI+的TGpMatrix布局基本一样,所以关于类的使用方法就不再介绍了,本文的目的在于如何实现自己的平面几何变换类,否则,不如直接用GDI+的TGpMatrix了。

TTransformMatrix的核心代码是Multiply方法(或ElementsMultiply方法)和Invert方法。

Multiply方法通过2个TTransformMatrix的相乘来实现各种复杂的几何变换计算,所有能够实现的具体几何变换都是可以通过其完成的(代码中的平移函数Translate也可以通过其完成的,当然多了一些不必要的计算)。无论是TTransformMatrix类还是GDI+的TGpMatrix类,所提供的都只是基本的几何变换方法,还有些图形图像几何变换,如对称几何变换(镜像)和各种复杂的组合变换。都只能通过Multiply方法或者更直接的变换矩阵成员设置去实现。

Invert方法实现了变换矩阵的逆矩阵,通过这个几何变换逆矩阵,可以很方便地实现图形图像几何变换的实际操作。为什么要靠几何变换矩阵的逆矩阵,而不是直接依据变换矩阵来实现图形图像几何变换的实际操作呢?因为几何变换矩阵表示的意思是,把源图像的任意座标点通过几何变换后投影到目标图像。而源图像像素通过几何变换后与目标图像上的像素点有可能不能一一对应,如图像缩放变换后,不是多个源图像像素点对应同一个目标像素点(缩小),就是源图像像素点不足以填充全部的目标像素点(放大),这就有可能造成目标图像像素点被重复绘制或者被遗漏的现象发生;而几何变换逆矩阵所表示的意思是,对于目标图像任意一个像素点,如果在几何变换前有源图像像素点与其对应,则进行复制。遍历目标图像像素点就能保证目标图像像素点既不重复、也不遗漏的被复制。

为了检验TTransformMatrix类,写了2个简单的过程来实现具体图像几何变换:

这2个过程都使用了GDI+的TBitmapData类型,而非具体的图像类作为参数类型,使得它们具有一定的通用性和扩展性。

GetSubBitmapData函数用于获取一个界定了范围的子图像数据,减少了像素操作时的计算,而Transform过程则用来实现具体的图像几何变换。上面之所以说“简单”,指的是Transform过程复制像素时使用的是直接临近取值,这样转换出来的图像质量较差;而且计算像素地址时采用了浮点数运算,影响了变换速度。但是这个过程的框架却是较完整的,可在此基础上加入像素插值方式,再改浮点数运算为定点数运算,该过程就比较完善了。

下面是一个TBitmap类型的图像进行缩放加剪切的例子:

原图像和运行界面截图:

说明:本文中使用的GDI+版本下载地址:

GDI+ for VCL and GDI+ for C语言2010.10.7最新修改版。

如果使用其它GDI+版本,或者不使用GDI+,可将前面TransformMatrix单元里的:

// 几何变换矩阵结构
PMatrixElements = Gdiplus.PMatrixElements;
TMatrixElements = Gdiplus.TMatrixElements;

改为:

TMatrixElements=packedrecord
caseIntegerof
0:(Elements:array[0..5]ofSingle);
1:(m11,m12,m21,m22,dx,dy:Single);
end;
PMatrixElements
=^TMatrixElements;

如有错误请来信指正:maozefa@hotmail.com

如果转载,请注明出处。

分享到:
评论

相关推荐

    计算机图形学基础-pdf.zip

    6.2.6二维图形几何变换的计算 6.3复合变换 6.3.1二维复合平移变换和比例变换 6.3.2二维复合旋转变换 6.3.4其他二维复合变换 6.3.5相对任一参考点的二维几何变换 6.3.6相对于任意方向的二维几何变换 ...

    OpenGL基础图形编程

     8.2.5 几何变换举例  8.3 投影变换  8.3.1 正射投影  8.3.2 透视投影  8.4 裁剪变换  8.5 视口变换  8.6 堆栈操作  第九章 OpenGL颜色  9.1 计算机颜色  9.1.1 颜色生成原理  9.1.2 RGB色立体  9.2 ...

    OpenGL图形开发指南(0fen)

    8.1.3 基本变换简单分析 8.2 几何变换 8.2.1 两个矩阵函数解释 8.2.2 平移 8.2.3 旋转 8.2.4 缩放和反射 8.2.5 几何变换举例 8.3 投影变换 8.3.1 正射投影 8.3.2 透视投影 8.4 裁剪变换 8.5 视口变换 ...

    2001(文史类)数学

    此外,还需要掌握空间几何中的平面与直线的关系、立体图形的表面积和体积计算等。 数据与统计:考生需要能够分析和解读给定的数据,并进行简单的统计计算。这包括了数据的整理、计算平均数、中位数、众数等统计指标...

    华东《计算机图形学》2017年春学期在线作业(一).doc

    用齐次坐标技术可以对平移、比例、旋转等几何变换用矩阵乘法来处理 D. 齐次坐标表示技术不可以用来表示无穷远点 正确答案: 2. 以下关于图形变换的论述那些是错误的〔 〕. A. 错切变换虽然可引起图形角度的改变,但...

    OpenGL 基础教程

     8.2.5 几何变换举例  8.3 投影变换  8.3.1 正射投影  8.3.2 透视投影  8.4 裁剪变换  8.5 视口变换  8.6 堆栈操作  第九章 OpenGL颜色  9.1 计算机颜色  9.1.1 颜色生成原理  9.1.2 RGB色立体  9.2 ...

    matlab常用函数大全

    11.1 基本平面图形 11.2 轴控制 11.3 图形注释 12、三维图形函数 12.1 基本三维图形 12.2 色彩控制 12.3 色图 13、文件输入/输出 14、示例函数 15、符号工具包 15.1 微积分 15.2 线性代数 15.3 化简 ...

    玲珑画板 v5.091.zip

    对平面几何,立体几何,解析几何,函数,不等式,等应用广泛。针对画图,动态演示,问题探索,等动态几何教学。 玲珑画板功能特色: 灵活性:玲珑画板是一款真三维的数学工具软件,对于空间任意点、线、圆、面及由...

    AxMath数学公式编辑器.7z

    AxMath是一款专业的...3、支持函数分析:包括概率论、积分变换、平面几何、微积分、无穷级数、线性代数、向量代数基础; 4、提供函数图像查看,支持微分方程、初等函数、代数、复变函数、复数以及复平面、复变函数。

    光平面标定matlab代码-validation_repo:验证仓库

    例程旨在对眼睛的单眼红外视频进行操作,并提取图像平面中瞳Kong的椭圆边界。 无需明确校准即可估计绝对瞳Kong大小和注视位置。 值得注意的是,该软件是计算密集型的,旨在根据实验会话期间收集的视频离线运行。 一...

    Visual Pattern Recognition by Moment Invariants

    这篇文章介绍有二维不变矩在平面几何图形中的应用理论。其中将推导一个与代数不变量相关的不变矩的定理。并证明推导平移变换,相似变换以及正交变换中不变矩的完整体系。一些线性变换中涉及到的不变矩也会有提及。

    GSP5.exe

    几何画板是适用于数学、平面几何、物理的矢量分析、作图,函数作图的动态几何工具。 《几何画板》软件是由美国Key Curriculum Press公司制作并出版的优秀教育软件,1996年该公司授权在中国发行该软件的中文版。正如...

    虚拟现实技术与应用

    3.2.1 基于几何图形的实时绘制技术 3.2.2 基于图像的实时绘制技术 3.3 三维虚拟声音的显示技术 3.3.1 三维虚拟声音的概念与作用 3.3.2 三维虚拟声音的特征 3.3.3 人类的听觉模型与头相关转移函数 3.3.4 语音识别与...

    OPenGL编程书籍

    在一课我们将教你绘制3D的图形字体,它们可像一般的3D模型一样被变换。 15.图形字体的纹理映射: 这一课,我们将在上一课的基础上创建带有纹理的字体,它真的很简单。 16.看起来很酷的雾 这一课是基于第7课的代码...

    Nehe的OpenGL教程电子书

    在一课我们将教你绘制3D的图形字体,它们可像一般的3D模型一样被变换。 15.图形字体的纹理映射: 这一课,我们将在上一课的基础上创建带有纹理的字体,它真的很简单。 16.看起来很酷的雾 这一课是基于第7...

    OpenGL ES 3.0

    OpenGL ES 3.0 英文版 第1章——OpenGL ES 3.0简介  第1章简单介绍OpenGL ES,概述了OpenGL ES 3.0图形管线,讨论了OpenGL ES 3.0的设计理念和限制,最后介绍了OpenGL ES 3.0中使用的一些约定和类型。  第2章——...

Global site tag (gtag.js) - Google Analytics