Android学习笔记---Matrix矩阵

Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操做。android

在Android里面,Matrix由9个float值构成,是一个3*3的矩阵。最好记住。以下图:canvas

解释一下,上面的sinXcosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的。app

translateXtranslateY表示xy的平移量。scale是缩放的比例,1是不变,2是表示缩放1/2,这样子。函数

例如:从最简单的旋转90度post

Rotate-90-Matrix

在android.graphics.Matrix中有对应旋转的函数:
Matrix matrix = new Matrix();
matrix.setRotate(90);
在程序中输出矩阵:System.out.println("matrix:" + matrix.toString());spa

你会发现同样东西:orm

与上面的公式基本彻底同样(android.graphics.Matrix采用的是浮点数,而咱们采用的整数)。对象

有了上面的例子,相信你们就能够亲自尝试了。经过上面的例子咱们也发现,咱们也能够直接来初始化矩阵,好比说要旋转30度:图片

意思是说咱们能够直接操做矩阵Matrix来代替那些旋转函数,缩放函数等。图片处理

来具体看个例子:旋转45度

  1. // 定义矩阵对象  

  2.         Matrix matrix = new Matrix();  

  3.         float[] values ={0.707f,-0.707f,0.0f,0.707f,0.707f,0.0f,0.0f,0.0f,1.0f};  

  4.         matrix.setValues(values);  

  5.         System.out.println("matrix:" + matrix.toString());  

  6.         //bmp.getWidth(), 500分别表示重绘后的位图宽高  

  7.         Bitmap dstbmp = Bitmap.createBitmap(bmp, 00, bmp.getWidth(), 500,  

  8.                 matrix, true);  

  9.         // 在画布上绘制旋转后的位图  

  10.         //放在坐标为0,200的位置  

  11.         canvas.drawBitmap(dstbmp, 0200null);  


在Android中,对图片的处理须要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型:

一、Translate————平移变换

二、Scale————缩放变换

三、Rotate————旋转变换

四、Skew————错切变换

在Android的API里对于每一种变换都提供了三种操做方式:set(用于设置Matrix中的值)、post(后乘,根据矩阵的原理,至关于左乘)、pre(先乘,至关于矩阵中的右乘)。默认时,这四种变换都是围绕(0,0)点变换的,固然能够自定义围绕的中心点,一般围绕中心点。

首先说说平移,在对图片处理的过程当中,最经常使用的就是对图片进行平移操做,该方法为setTranslate(),平移意味着在x轴和y轴上简单地移动图像。setTranslate方法采用两个浮点数做为参数,表示在每一个轴上移动的数量。第一个参数是图像将在x轴上移动的数量,而第二个参数是图像将在y轴上移动的数量。在x轴上使用正数进行平移将向右移动图像,而使用负数将向左移动图像。在y轴上使用正数进行平移将向下移动图像,而使用负数将向上移动图像。

再看缩放,Matrix类中另外一个有用的方法是setScale方法。它采用两个浮点数做为参数,分别表示在每一个轴上所产生的缩放量。第一个参数是x轴的缩放比例,而第二个参数是y轴的缩放比例。如:matrix.setScale(1.5f,1);
比较复杂的就是图片的旋转了,内置的方法之一是setRotate方法。它采用一个浮点数表示旋转的角度。围绕默认点(0,0),正数将顺时针旋转图像,而负数将逆时针旋转图像,其中默认点是图像的左上角,如:

Matrix matrix = new Matrix();
matrix.setRotate(15);

另外,也可使用旋转的角度及围绕的旋转点做为参数调用setRotate方法。选择图像的中心点做为旋转点,如:
matrix.setRotate(15,bmp.getWidth()/2,bmp.getHeight()/2);

对于错切变换,在数学上又称为Shear mapping(可译为“剪切变换”)或者Transvection(缩并),它是一种比较特殊的线性变换。错切变换的效果就是让全部点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发平生移,且平移的大小和该点到x轴(或y轴)的垂直距离成正比。错切变换,属于等面积变换,即一个形状在错切变换的先后,其面积是相等的。

对于程序中,一个特别有用的方法对是setScale和postTranslate,它们容许跨单个轴(或者两个轴)翻转图像。若是以一个负数缩放,那么会将该图像绘制到坐标系统的负值空间。因为(0,0)点位于左上角,使用x轴上的负数会致使向左绘制图像。所以咱们须要使用postTranslate方法,将图像向右移动,如:

matrix.setScale(-1, 1);
matrix.postTranslate(bmp.getWidth(),0);

能够在y轴上作一样的事情,翻转图像以使其倒置。经过将图像围绕两个轴上的中心点旋转180°,能够实现相同的效果,如
matrix.setScale(1, -1);
matrix.postTranslate(0, bmp.getHeight());

相关文章
相关标签/搜索