浅谈android中图片处理之图形变换特效Matrix(四)

今天,我们就来谈下android中图片的变形的特效,在上讲博客中我们谈到android中图片中的色彩特效来实现的。改变它的颜色主要通过ColorMatrix类来实现。
现在今天所讲的图片变形的特效主要就是通过Matrix类来实现,我们通过上篇博客知道,改变色彩特效,主要是通过ColorMatrxi矩阵的系数,以及每个像素点上所对应的颜色偏移量。而今天的图形变换与那个也是非常的类似。它是一个3*3矩阵,而颜色矩阵则是一个4*5的矩阵。在这个3*3矩阵中则表述出了每个像素点的XY坐标信息。然后通过修改这个矩阵,就可达到修改图片中的每个像素点的XY坐标,即改变每个像素点的位置信息,通过对特定的矩阵元素值的修改就可以达到实现图片的中的
图形变换特效如:平移变换特效,旋转变换特效,缩放变换特效,错切变换特效。那么接下来我们就通过从原理的角度来一一分析下每个特效对应的矩阵是怎么样的。
默认的图形变换的初始矩阵是:
                        1  0  0 
                        0  1  0
                        0  0  1
  第一、平移变换特效:
                 我们很容易知道这个,在一个平面中,将一个像素点从位置A(x0,y0)移到另一个位置B(x,y)
很容易得到如下的公式:
                   x=x0+X方向的偏移量(xt);
                   y=y0+Y方向的偏移量(yt);
依据上面的等式我们很容易得到如下矩阵:


      |x|     |1 0 xt|  |x0|
                   |y| =  |0 1 yt| ×    |y0|
                   |1|     |0 0  1|       | 1 |
然后我们通过如上的矩阵乘法计算得到等式(与我们得出的结论一致,所以也就是我们通过改变初始矩阵中那个矩阵元素的值就可以实现图片在X,Y方向上的平移):
                    x=x0+X方向的偏移量(xt);
                    y=y0+Y方向的偏移量(yt);
 第二、旋转变换特效:


                   所谓旋转变换就相当于一个像素点围绕某个中心点O旋转到一个新的点,在高中学过三角函数的都知道,通过从初始点A(x0,y0)旋转到B点(x,y)
初始点与X轴正方向夹角为a,旋转过的角度为t,通过三角函数的计算得出如下公式:
                  设:旋转轴长为:r
                   x0=r*cosa;  y0=r*sina;
                   x=r*cos(a+t)=r*cosa*cost-rsina*sint=x0*cost-y0*sint;
                   y=r*sin(a+t)=r*sina*cost+r*cosa*sint=y0*cost+x0*sint;
从而可以得出如下矩阵:
                    |x|    |cost -sint 0| |x0|
                    |y| = |sint  cost 0| ×|y0|
                    |1|    |0      0     1|    | 1 |
然后我们通过如上的矩阵乘法计算得到等式(与我们得出的结论一致,所以也就是我们通过改变初始矩阵中那个矩阵元素的值就可以实现图片旋转):


                   x=x0*cost-y0*sint;
                                                                  y=y0*cost+x0*sint;
注意:前面所讲的旋转都是以坐标的原点为旋转中心的,我们还可以以任意点O为旋转中心来进行旋转的变换但是通常需要如下三个步骤:
首先第一需要将坐标的原点平移到任意指定的点O,然后再使用上述我们的所讲的旋转方法来进行旋转,最后就需要将我们的原点还原回去。
第三、缩放变换特效:
                 所谓像素点的缩放,实际上并不会对像素点缩放,因为像素点已经够小了,不存在什么缩放的概念,那我们这里所说的缩放是怎么样的呢?
我们是通过将每个像素点所在的XY坐标按一定的比例缩放,然后使得图片整体看起来的有一个缩放的效果。
                    x=K1*x0
                                    y=K2*y0 
通过以上公式反映到我们的变换矩阵中的形式:
                              |x|    |K1 0 0| |x0|
                      |y| = |0 K2 0| ×|y0|
                      |1|    |0 0   1|   | 1 |
通过矩阵乘法验证得到等式(与我们得出的结论一致,所以也就是我们通过改变初始矩阵中那两个矩阵元素的值就可以实现图片在X,Y方向上的缩放)
第四、错切变换特效:
                所谓错切变换的效果很类似数学上的Shear mapping.错切主要分两种形式:
第一水平错切变换:就是在正常图片的基础上,让每个像素点的Y轴坐标保持不变,而让他们的X坐标按一定比例的缩放,第二就是垂直错切变换:就是在原图的基础上,让让每个像素点的X坐标保持不变,让Y坐标按一定比例的缩放。从而可以得到如下的变换公式:
                 x=x0+K1*y0;y=x0+K2*y0;
通过以上的公式反应到我们的变换矩阵中的形式:
                 
      |x|    |1    K1  0| |x0|
                   |y| =  |K2  1   0| ×|y0|
                   |1|    |0     0    1|  | 1 |
通过矩阵乘法验证得到等式(与我们得出的结论一致,所以也就是我们通过改变初始矩阵中那两个矩阵元素的值就可以实现图片在X,Y方向上的错切)
综合上述:将得出我们最后的矩阵变换公式:
                    |Scale_X Skew_X  Trans_X|
                    |Skew_Y  Scale_Y Trans_Y|
                    | 0               0             1        |
也就是我只需要改变矩阵中对应的元素的值,我们就可以实现各种变换的特效。
如果用A,B,C,D,E,F来一次标示那些区的话,A和E决定缩放变换,B和D决定了错切变换,C和F决定了平移变换

下面我们就通过一个Demo来验证一下我们的观点。 

package com.mikyou.matrix;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;


public class MainActivity extends Activity {
	private ImageView iv;
	private Canvas canvas;
	private Paint paint;
	private Bitmap baseBitmap;
	private Bitmap copyBitmap;
	private Matrix matrix;
	private EditText e1,e2,e3,e4,e5,e6,e7,e8,e9;
	private float t1,t2,t3,t4,t5,t6,t7,t8,t9;
	private List<Float> valueList;
	public void ok(View view){
		valueList=new ArrayList<Float>();
		valueLis
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊喵先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值