以Android为例,在使用Matrix进行绘图时有如下变换方法

// 缩放
public boolean preScale(float sx, float sy, float px, float py)
// 平移
public boolean preTranslate(float dx, float dy)
// 旋转    
public boolean preRotate(float degrees, float px, float py)
// 倾斜    
public boolean preSkew(float kx, float ky, float px, float py)

​ 在我们进行图片变换的时候,需要做各种各样的操作,其中的原理需要我们细细体会一下,今天来总结下图形变换的核心原理

​ 首先我们计(w,v)(w,v)为源图像的像素点位置,(x,y)(x,y)为目标像素点的位置。我们当前有一个变化因子记为TT,这三者之前存在着这样的映射关系:

(x,y,1)=(w,v,1)T(x,y,1)=(w,v,1)T​

T是一个3×33×3的矩阵

​ T = [100010001]\begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1\\ \end{bmatrix}

变换名称 仿射矩阵 坐标公式
恒等变换 [100010001] \begin {bmatrix}1&0&0\\0&1&0\\0&0&1\\\end{bmatrix} x=w y=v
尺度变换 [Cx000Cy0001] \begin {bmatrix}C_x&0&0\\0&C_y&0\\0&0&1\\\end{bmatrix} $x=C_x w $ y=Cyv=C_yv
旋转变换 [cosθsinθ0sinθcosθ0001] \begin {bmatrix}cos \theta&sin\theta&0\\-sin\theta &cos\theta &0\\0&0&1\\\end{bmatrix} x=wcosθvsinθx= wcos\theta -vsin\theta y=vsinθ+wcosθy = vsin\theta +w cos\theta
平移变换 [100010txty1] \begin {bmatrix}1&0&0\\0&1&0\\t_x&t_y&1\\\end{bmatrix} $x = w + t_x $ y=v+tyy = v + t_y
偏移变换 [1C10C210001] \begin {bmatrix}1&C_1&0\\C_2&1&0\\0&0&1\\\end{bmatrix} x=wC1+vx = w C_1 + v y=wC2+vy = wC_2 + v

以缩放为例,下图为缩放图像

图形变换核心原理(平移、缩放、旋转,拉伸)

公式如下

(w,v,1)[200020001]=(2w,2v,1)(w,v,1) * \begin {bmatrix}2&0&0\\0&2&0\\0&0&1\\\end{bmatrix} = (2w,2v ,1)

(0,0)坐标变成(0,0)

(0,1)坐标变成(0,2)

(1,1)坐标变成(2,2)

(1,0)坐标变成(2,0)

相关文章: