天天看點

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。

這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。

下面将分别介紹這兩個矩陣的用法和相關的函數。

顔色矩陣

android中可以通過顔色矩陣(ColorMatrix類)方面的操作顔色,顔色矩陣是一個5x4 的矩陣(如圖1.1)

可以用來方面的修改圖檔中RGBA各分量的值,顔色矩陣以一維數組的方式存儲如下:

 [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ]

他通過RGBA四個通道來直接操作對應顔色,如果會使用Photoshop就會知道有時處理圖檔通過控制RGBA各顔色通道來做出特殊的效果。

這個矩陣對顔色的作用計算方式如1.3示:

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

矩陣的運算規則是矩陣A的一行乘以矩陣C的一列作為矩陣R的一行,

C矩陣是圖檔中包含的ARGB資訊,R矩陣是用顔色矩陣應用于C之後的新的顔色分量,運算結果如下:

R' = a*R + b*G + c*B + d*A + e;

G' = f*R + g*G + h*B + i*A + j;

B' = k*R + l*G + m*B + n*A + o;

A' = p*R + q*G + r*B + s*A + t;

顔色矩陣并不是看上去那麼深奧,其實需要使用的參數很少,而且很有規律第一行決定紅色第二行決定綠色

第三行決定藍色,第四行決定了透明度,第五列是顔色的偏移量。下面是一個實際中使用的顔色矩陣。

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

如果把這個矩陣作用于各顔色分量的話,R=A*C,計算後會發現,各個顔色分量實際上沒有任何的改變(R'=R G'=G B'=B A'=A)。

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

圖1.5所示矩陣計算後會發現紅色分量增加100,綠色分量增加100,

這樣的效果就是圖檔偏黃,因為紅色和綠色混合後得到黃色,黃色增加了100,圖檔當然就偏黃了。

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

改變各顔色分量不僅可以通過修改第5列的顔色偏移量也可如上面矩陣所示将對應的顔色值乘以一個倍數,直接放大。

上圖1.6是将綠色分量乘以2變為原來的2倍。相信讀者至此已經明白了如何通過顔色矩陣來改變各顔色分量。

下面編寫一段代碼來,通過調整顔色矩陣來獲得不同的顔色效果,JavaCode如下:

複制到剪貼闆  Java代碼

1  CMatrix類: 

2    public   class  CMatrix  extends  Activity { 

4  private  Button change; 

5  private  EditText [] et = new  EditText[ 20 ]; 

6  private   float  []carray = new   float [ 20 ]; 

7  private  MyImage sv; 

8  @Override 

9  public   void  onCreate(Bundle savedInstanceState) { 

10  super .onCreate(savedInstanceState); 

11  setContentView(R.layout.main); 

12 

13  change = (Button)findViewById(R.id.set); 

14  sv = (MyImage)findViewById(R.id.MyImage); 

15 

16  for ( int  i = 0 ;i < 20 ;i ++ ){ 

17 

18  et[i] = (EditText)findViewById(R.id.indexa + i); 

19  carray[i] = Float.valueOf(et[i].getText().toString()); 

20  } 

21 

22  change.setOnClickListener(l); 

23  } 

24 

25  private  Button.OnClickListener l = new  Button.OnClickListener(){ 

26 

27  @Override 

28  public   void  onClick(View arg0) { 

29  //  TODO Auto-generated method stub 

30     getValues(); 

31  sv.setValues(carray); 

32  sv.invalidate(); 

33  } 

34 

35  }; 

36  public   void  getValues(){ 

37  for ( int  i = 0 ;i < 20 ;i ++ ){ 

38 

39  carray[i] = Float.valueOf(et[i].getText().toString()); 

40  } 

41 

42  } 

43 

44 

45  } 

46  MyImage類繼承自View類: 

47  public   class  MyImage  extends  View { 

48  private  Paint mPaint  =   new  Paint(Paint.ANTI_ALIAS_FLAG); 

49  private  Bitmap mBitmap; 

50  private   float  [] array = new   float [ 20 ]; 

51 

52  private   float  mAngle; 

53 

54  public  MyImage(Context context,AttributeSet attrs) { 

55  super (context,attrs); 

56 

57  mBitmap  =  BitmapFactory.decodeResource(context.getResources(), 

58  R.drawable.test); 

59  invalidate(); 

60  } 

61 

62 

63  public   void  setValues( float  [] a){ 

64  for ( int  i = 0 ;i < 20 ;i ++ ){ 

65  array[i] = a[i]; 

66  } 

67 

68  } 

69 

70  @Override  protected   void  onDraw(Canvas canvas) { 

71  Paint paint  =  mPaint; 

72 

73 

74 

75  paint.setColorFilter( null ); 

76  canvas.drawBitmap(mBitmap,  0 ,  0 , paint); 

77 

78  ColorMatrix cm  =   new  ColorMatrix(); 

79  // 設定顔色矩陣 

80  cm.set(array); 

81  // 顔色濾鏡,将顔色矩陣應用于圖檔 

82  paint.setColorFilter( new  ColorMatrixColorFilter(cm)); 

83  // 繪圖 

84  canvas.drawBitmap(mBitmap,  0 ,  0 , paint); 

85  Log.i( " CMatrix " ,  " --------->onDraw " ); 

86 

87 

88  } 

89 

90  }

CMatrix類主要負責接收顔色矩陣的設定和重繪,沒有要說的。MyImage類中進行繪圖工作,首先設定顔色矩陣cm.set(..)從一維數組中讀取資料20個資料給顔色矩陣指派,paint.setColorFilter(..)設定顔色濾鏡,然後繪圖,效果就出來了(這個過程和PS差不多)如下:

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。
Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。
Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。
Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

看到這裡,相信大家對顔色矩陣的作用已經有了一個直覺的感受,現在也可以嘗試做一個照片特效的軟體。

但是各種效果并不能讓使用者手動調節顔色矩陣,這裡需要計算公式,由于本人并不是做圖形軟體的也不能提供,可以參考這個連結:

http://www.adobe.com/devnet/flash/articles/matrix_transformations/ColorMatrixDemo.swf

坐标變換矩陣

坐标變換矩陣是一個3*3的矩陣如圖2.1,用來對圖形進行坐标變化,将原來的坐标點轉移到新的坐标點,

因為一個圖檔是有點陣和每一點上的顔色資訊組成的,是以對坐标的變換,就是對每一點進行搬移形成新的圖檔。

具體的說圖形的放大縮小,移動,旋轉,透視,扭曲這些效果都可以用此矩陣來完成。

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

這個矩陣的作用是對坐标x,y進行變換計算結果如下:

x'=a*x+b*y+c

y'=d*x+e*y+f

通常情況下g=h=0,這樣使1=0*x+0*y+1恒成立。和顔色矩陣一樣,坐标變換矩陣真正使用的參數很少也很有規律。

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

上圖就是一個坐标變換矩陣的簡單例子,計算後發現x'=x+50,y'=y+50.

可見圖檔的每一點都在x和y方向上平移到了(50,50)點處,這種效果就是平移效果,将圖檔轉移到了(50,50)處。

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

計算上面得矩陣x'=2*x,y‘=2*y.經過顔色矩陣和上面轉移效果學習,相信讀者可以明白這個矩陣的作用了,這個矩陣對圖檔進行了放大,具體的說是放大了二倍。

下面将介紹幾種常用的變換矩陣:

1.      旋轉

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

繞原點逆時針旋轉θ度角的變換公式是 x' = xcosθ − ysinθ 與 y。' = xsinθ +    ycosθ

2.      縮放

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

變換後長寬分别放大x'=scale*x;y'=scale*y.

3.         切變

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

4.         反射

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

( , )機關向量

5.         正投影

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

( , )機關向量

上面的各種效果也可以疊加在一起,既矩陣的組合變換,可以用矩陣乘法實作之,如:R=B(A*C)=(B*A)C,注意一點就是B*A和A*B一般是不等的。

下面将編一個小程式,通過控制坐标變換矩陣來達到控制圖形的目的,JavaCode如下:

複制到剪貼闆  Java代碼

1 CooMatrix類: 

2  

3 public   class  CooMatrix  extends  Activity { 

4  

5   private  Button change; 

6   private  EditText [] et = new  EditText[ 9 ]; 

7   private   float  []carray = new   float [ 9 ]; 

8   private  MyImage sv; 

9    

10  @Override 

11   public   void  onCreate(Bundle savedInstanceState) { 

12   super .onCreate(savedInstanceState); 

13  setContentView(R.layout.main); 

14  

15  change = (Button)findViewById(R.id.set); 

16  sv = (MyImage)findViewById(R.id.MyImage); 

17  

18   for ( int  i = 0 ;i < 9 ;i ++ ){ 

19  

20  et[i] = (EditText)findViewById(R.id.indexa + i); 

21  carray[i] = Float.valueOf(et[i].getText().toString()); 

22  

23  } 

24  

25  change.setOnClickListener(l); 

26  

27  

28  } 

29  

30   private  Button.OnClickListener l = new  Button.OnClickListener(){ 

31  

32  @Override 

33   public   void  onClick(View arg0) { 

34   //  TODO Auto-generated method stub 

35  getValues(); 

36  sv.setValues(carray); 

37  sv.invalidate(); 

38  } 

39  

40  }; 

41   public   void  getValues(){ 

42   for ( int  i = 0 ;i < 9 ;i ++ ){ 

43  

44  carray[i] = Float.valueOf(et[i].getText().toString()); 

45  } 

46  

47  } 

48  

49  

50 } 

51 MyImage類繼承自View類: 

52 public   class  MyImage  extends  View { 

53   private  Paint mPaint  =   new  Paint(Paint.ANTI_ALIAS_FLAG); 

54   private  Bitmap mBitmap; 

55   private   float  [] array = new   float [ 9 ]; 

56  

57  

58  

59   public  MyImage(Context context,AttributeSet attrs) { 

60   super (context,attrs); 

61  

62  mBitmap  =  BitmapFactory.decodeResource(context.getResources(), 

63  R.drawable.ic_launcher_android); 

64  invalidate(); 

65  } 

66  

67  

68   public   void  setValues( float  [] a){ 

69   for ( int  i = 0 ;i < 9 ;i ++ ){ 

70  array[i] = a[i]; 

71  } 

72  

73  } 

74  

75  @Override  protected   void  onDraw(Canvas canvas) { 

76  Paint paint  =  mPaint; 

77  canvas.drawBitmap(mBitmap,  0 ,  0 , paint); 

78   // new 一個坐标變換矩陣 

79  Matrix cm  =   new  Matrix(); 

80 // 為坐标變換矩陣設定響應的值 

81  cm.setValues(array); 

82 // 按照坐标變換矩陣的描述繪圖 

83  canvas.drawBitmap(mBitmap, cm, paint); 

84  Log.i( " CMatrix " ,  " --------->onDraw " ); 

85  

86  

87  } 

88  

89 }

上面的代碼中類CooMatrix用于接收使用者輸入的坐标變換矩陣參數,類MyImage接收參數,通過setValues()設定矩陣參數,然後Canvas調用drawBitmap繪圖。效果如下:

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。
Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。
Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

上面給出了用坐标變換矩陣做出的各種效果,用坐标變換矩陣可以方面的調節圖形的各種效果,

但是我們看看Matrix類就可以發現,實際上,matrix類本身已經提供了許多類似的方法,我們隻要調用,就可以了。

setScale(float sx, float sy, float px, float py) 放大 

setSkew(float kx, float ky, float px, float py) 斜切 

setTranslate(float dx, float dy)                       平移 

setRotate(float degrees, float px, float py)    旋轉 

上面的函數提供了基本的變換平移,放大,旋轉,斜切。為了做出更複雜的變換,同時不必親手去改動坐标變換矩陣,

Matrix類提供了許多Map方法,将原圖形映射到目标點構成新的圖形,

下面簡述setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) 的用法,希望起到舉一反三的作用。

參數src和dst是分别存儲了原圖像的點和和指定的目标點的一維數組,數組中存儲的坐标格式如下:

 [x0, y0, x1, y1, x2,y2,...]

這個個函數将src中的坐标映射到dst中的坐标,實作圖像的變換。

具體的例子可以參考APIDemos裡的PolyToPoly,我在這裡就不再貼代碼了,隻講一下函數是怎麼變換圖檔的。下面是效果:

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

圖中寫1的是原圖,寫有2,3,4的是變換後的圖形。現在分析2是怎麼變換來的,變換的原坐标點和目的坐标點如下:

src=new float[] { 32, 32, 64, 32 }

dst=new float[] { 32, 32, 64, 48 }

Android圖檔處理(Matrix,ColorMatrix) 在程式設計中有時候需要對圖檔做特殊的處理,比如将圖檔做出黑白的,或者老照片的效果,有時候還要對圖檔進行變換,以拉伸,扭曲等等。 這些效果在android中有很好的支援,通過顔色矩陣(ColorMatrix)和坐标變換矩陣(Matrix)可以完美的做出上面的所說的效果。 下面将分别介紹這兩個矩陣的用法和相關的函數。

從上圖示示出的坐标看出原圖的(32,32)映射到原圖的(32,32),(64,32)映射到原圖(64,48)這樣的效果是圖像放大了而且發生了旋轉。這樣的過程相當于(32,32)點不動,然後拉住圖形(64,32)點并拉到(64,48)點處,這樣圖形必然會被拉伸放大并且發生旋轉。最後用一個平移将圖形移動到右邊現在的位置。希望能夠好好了解這一過程,下面的3,4圖是同樣的道理。

本文轉載于:http://www.cnblogs.com/leon19870907/articles/1978065.html

繼續閱讀