Windows Mobile上实现图片任意角度旋转

来源:互联网 发布:商品分类数据库设计 编辑:程序博客网 时间:2024/05/01 08:43

Windows Mobile上实现图片任意角度旋转

作者:金海建

 

目的:在Windows Mobile上,微软的API和库不支持图片的任意角度旋转,只支持90,180,270度旋转。既然它不支持我们只能自力更生了。

简介:通过介绍和实现旋转PNG图片,来说明实现图片旋转的方法。过程大概如下,先用Imaging读取并解码png图片,使之转成ARGB格式的位图。然后利用顶点旋转的公式,对位图矩阵进行旋转,旋转完成后,利用Imaging库,转换成IImage接口。最后利用IImage接口来画图。

 

    先来看下平面直角坐标变换的旋转坐标变换,其定义是

定义:若二坐标系{Oij}{O′;i′,j}满足OO′,另∠(ij′)=θ

        则坐标系{O′;i′,j}可看成是由坐标系{Oij}O旋转θ角得到的,称由{Oij}{O′;i′,j}的变换为旋转坐标变换

旋转公式为:

X' =  X cosθ -  Y sinθ

Y' =  X sinθ  + Y cosθ

由于我们是用数组的下表来表示坐标的,所以最小的坐标是为(0,0)。我们需要先做坐标旋转,然后平移坐标。如下图所示:

 

平移的动作,是把所以的负坐标变成正坐标。用MinXMinY来表示最小的X坐标和Y坐标。

X' =  X cosθ -  Y sinθ - MinX;

Y' =  X sinθ  + Y cosθ - MinY;

根据上面的公式我们推出

x = (x'+MinX)cosθ+ (y'+MinY)sinθ

y = (y'+MinY)conθ- (x'+MinX)sinθ

 

图片旋转后,会出现失真现象,需要用双线性内插值进行优化

双线性内插值:对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v),其中ij均为非负整数,uv[0,1)区间的浮点数,则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)(i+1,j)(i,j+1)(i+1,j+1)所对应的周围四个像素的值决定,即:

 f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)

其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。

这就是双线性内插值法。双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。

 

 

旋转代码

 

 

需要对浮点型运算,改为整形预算。在模拟上测试过,旋转一张图片,整形预算要比浮点型预算快20倍。

改为整形运算代码。

 

用Imaging接口加载png图片,并调用RotateImageBuf进行旋转,最后返回IImage接口。

 

 

原创粉丝点击