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());

相關文章
相關標籤/搜索