Windows Mobile上实现图片任意角度旋转
来源:互联网 发布:商品分类数据库设计 编辑:程序博客网 时间:2024/05/01 08:43
Windows Mobile上实现图片任意角度旋转
作者:金海建
目的:在Windows Mobile上,微软的API和库不支持图片的任意角度旋转,只支持90,180,270度旋转。既然它不支持我们只能自力更生了。
简介:通过介绍和实现旋转PNG图片,来说明实现图片旋转的方法。过程大概如下,先用Imaging读取并解码png图片,使之转成ARGB格式的位图。然后利用顶点旋转的公式,对位图矩阵进行旋转,旋转完成后,利用Imaging库,转换成IImage接口。最后利用IImage接口来画图。
先来看下平面直角坐标变换的旋转坐标变换,其定义是
定义:若二坐标系{O;i,j}和{O′;i′,j′}满足O≡O′,另∠(i,j′)=θ
则坐标系{O′;i′,j′}可看成是由坐标系{O;i,j}绕O旋转θ角得到的,称由{O;i,j}到{O′;i′,j′}的变换为旋转坐标变换。
旋转公式为:
X' = X cosθ - Y sinθ
Y' = X sinθ + Y cosθ
由于我们是用数组的下表来表示坐标的,所以最小的坐标是为(0,0)。我们需要先做坐标旋转,然后平移坐标。如下图所示:
平移的动作,是把所以的负坐标变成正坐标。用MinX和MinY来表示最小的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),其中i、j均为非负整数,u、v为[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接口。
- Windows Mobile上实现图片任意角度旋转
- Windows Mobile上实现图片任意角度旋转
- Java实现图片任意角度旋转
- 图片任意角度旋转
- C#实现任意角度旋转图片(方法1)
- C#实现任意角度旋转图片(方法2)
- C#实现任意角度旋转图片(方法1)
- C#实现任意角度旋转图片(方法2)
- Java实现图片内容无损任意角度旋转
- Java实现图片内容无损任意角度旋转
- C#实现任意角度旋转图片(方法1)
- C#实现任意角度旋转图片(方法1)
- C#实现任意角度旋转图片(方法2)
- Java实现图片内容无损任意角度旋转
- java 实现图片任意角度旋转,及背景透明
- 图片任意角度旋转(转)
- J2me中任意角度图片旋转
- c# winform任意角度图片旋转
- io内存映射ioremap() 做点笔记
- 自修改代码浅析
- 读书与看代码
- 查找锁表及解除
- java 时间处理类
- Windows Mobile上实现图片任意角度旋转
- hibernate的各种保存方式的区别
- 我是Windows盲+VC盲
- fatal error LNK1207: incompatible PDB format in "*******"; delete and rebuild
- Linux Shell 笔记二(循环结构)
- poj3637
- 数据之美(六):美不胜收的数据图(下)
- 程序员应知——破窗与童子军军规
- 一个好的Performance测试数据仓库需要什么功能