Delphi图像处理 -- 图像旋转

图像旋转,是指按照给定的角度,计算出图像每个像素坐标点在新图像上的坐标位置,从而实现整个图像坐标变换的图像处理手段。其像素坐标的变换公式为:

(1)、x' = x * cos(angle) + y *sin(andle)

y' = x * -sin(angle)+y * cos(andle)

公式中,x',y'为变换后的像素坐标点,x,y为变换前像素坐标点,angle为旋转角度。

但是,按照上面的公式旋转图像,会出现多个原图像像素点对应新图像同一个点的问题,这不仅会多消耗图像旋转处理的时间,而且也会使旋转后的图像产生不必要的失真,如果是32位带Alpha通道像素格式的图像,更会因此造成图像的混乱,所以在实际的图像旋转处理代码中,是以目标图(旋转后的图像)的像素坐标点,逐点反推原图像素的位置,这样,目标图的各个像素点既不会重复,也不会遗漏。其计算公式为:

(2)、x = x' * cos(angle) - y' * sin(angle)

y = x' * sin(angle) + y' * cos(angle)

下面是Delphi图像旋转处理的代码:

同图像缩放处理一样,图像旋转的质量,也取决图像像素的插值方式,图像旋转时的像素插值也可选择临近插值、线性插值和双立方插值等方式,缺省时线性插值方式,代码中用到的内部像素插值过程见《Delphi图像处理 -- 图像缩放》。

本文的图像旋转处理是采用放大256倍后的定点整数运算,其运算速度是浮点运算不可比拟的,同时在像素处理前按照给定的旋转角度计算好了x,y坐标点的增量,因此在具体的逐点像素坐标变换时,不需要按照前面的像素坐标变换公式进行复杂的运算,而只是直接在放大256倍后的像素坐标点上进行加减,就可达到像素坐标变换的目的,这更加加快的图像的旋转处理过程。因此,本文的图像旋转过程处理速度还是较快的。

图像旋转处理最麻烦的还是边界像素的处理。本文的图像旋处理过程和图像缩放、卷积处理过程一样,使用ImageGetExpandData过程扩展了图像边界,但和图像旋转、卷积处理过程不同的是,图像旋转后,其边界会因为角度的变化,带来明显的边缘锯齿,为了解决这个问题,本过程将图像扩展的边界部分的Alpha通道置为了0,这样,在像素插值过程中,扩展边界像素的R、G、B各分量就较融洽地融合在目标图边界像素之间的背景色中,也就相当于进行了锯齿消除。

下面是个在TImage对象上进行图像任意角度旋转的例子。

运行界面图如下:

旋转前的界面

运行界面

文章中使用GDI+版本下载地址和说明见《GDI+ for VCL基础 -- GDI+ 与 VCL》。

文章中所用数据类型及一些过程见《Delphi图像处理 -- 数据类型及内部过程》和《Delphi图像处理 -- 图像像素结构与图像数据转换》。

尽管我十分努力,但水平有限,错误在所难免,欢迎指正和指导。邮箱地址:

[email protected]

说明:本文代码于2010.5.20重新修订过,在旋转处理过程中增加了一个Alpha参数,可实现半透明形式的图像旋转。

你可能感兴趣的:(数据结构,windows,UP,360,Delphi)