天天看點

Android中的Matrix類與ColorMatrix類

1.Matrix.

Android API中有一個Matirx類,當在現有位圖對象上進行繪制或從另一個位圖對象建立某個位圖對象時,可以使用該類。這個類可以讓我們對位圖進行旋轉、裁剪、縮放、平移等操作。

Matrix類是以9個float型數字的一維數組表示的。每個數字都對應于圖像上每個點的3個坐标(x,y或z)之一。

Matrix matrix = new Matrix();
matrix.setValues(new float[] { 
1, 0, 0, 
0, 1, 0,
0, 0, 1 });      

頂行(1,0,0)指定源圖像的x坐标将根據以下公式轉換:x=1*x+0*y+0*z。即頂行總會影響到目标圖像的x坐标,但可以操作源圖像的x,y,z坐标。

同理,第二行和第三行将影響目标圖像的y和z坐标。

Matrix類有以下成員方法:

setRotate(), setScale(), setTranslate(), 而這幾種方法還有個字之前之後的版本(preScale(), postRotate(), postTranslate()...),這使得我們可以每次按順序完成一個以上的轉換。

2.ColorMatrix

類似于在Canvas對象上繪制時使用Matrix對象的方法,也可以使用一個ColorMatrix對象來改變用于在Canvas對象上繪制的Paint對象。

同樣,ColorMatrix也是一個浮點數數組,可以對圖像的像素進行操作。然後不同于操作x, y和z坐标,它操作的是顔色值——每個像素的RGBA值。

ColorMatrix的使用方式:

ColorMatrix cm = new ColorMatrix();
paint.setColorFilter(new ColorMatrixColorFilter(cm));      

即建構一個ColorMatrixColorFilter對象,并将它應用于Paint對象,進而使得ColorMatrix對象可以用來改變Canvas對象上的繪制内容。

如上預設的ColorMatrix是不會改變圖像的,因為它形如:

1,0,0,0,0

0,1,0,0,0

0,0,1,0,0

0,0,0,1,0

第一行包含了在單個像素的紅色部分上發生的操作,第二行影響綠色部分,第三行影響藍色部分,最後一行操作的是Alpha值。

而與每行相乘的數字中,第一個數字是與像素的紅色值相關聯的乘數,第二個是綠色相關聯,第三個是藍色相關聯,第四個是與Alpha相關聯,而最後一個數字不與任何值相乘。

例如,如果想改變圖像的對比度和亮度可以這樣操作:

ColorMatrix cm = new ColorMatrix();
int contrast=2;
int brightness=-25;
cm.set(new float[] { 
  contrast, 0, 0, 0, brightness, 
  0, contrast, 0, 0, brightness, 
  0, 0, contrast, 0, brightness,
  0, 0, 0, 1, 0 });
//cm.setSaturation(.5f);//改變飽和度
paint.setColorFilter(new ColorMatrixColorFilter(cm));      

繼續閱讀