Android圖片處理:顏色矩陣和座標變換矩陣

UI開發過程當中,咱們常常須要對圖片進行處理,常見的如貼圖,複雜一些的還有位置變換、旋轉、濾鏡特效等,下面簡單介紹一下關於圖片處理的一些基本知識和原理。java

1 基本概念
對於圖片的處理,最常使用到的數據結構是Bitmap,它包含了一張圖片全部的數據,這些數據數據包括那些內容呢?簡單說來就是由點陣和顏色值組成的,所謂點陣就是一個在概念上是Width * Height的矩陣,每個元素對應着圖片的一個像素,也就是說,點陣保存着圖片的空間位置信息;而顏色值即ARGB,分別對應透明度、紅、綠、藍這四個通道份量,每一個通道用8比特定義,因此一個顏色值就是一個int整型,能夠表示256*256*256種顏色值。web

Android中咱們經常使用到這麼幾個常量:ARGB_888八、ARGB_444四、RGB_565。這幾個常量其實就是告訴系統如何對圖片的顏色值進行處理,例如ARGB_8888是告訴系統透明度、R、G、B在顏色值中分別用8bit表示,這時顏色值爲32bit,這樣的定義可以表示最多的顏色值,圖片質量也是最好的;ARGB_4444則是每一個通道用4bit表示,這樣顏色值只用16bit,節省了空間,可是卻只能表示16*16*16種顏色,也就是說圖片很失去不少彩色信息;RGB_565類型的顏色值一樣是16bit,可是它丟棄了透明度信息,能夠表示32*64*32種顏色值。canvas

2 顏色矩陣
顏色矩陣是一個5*4的矩陣,用來對圖片顏色值進行處理。定義顏色矩陣和顏色值以下以下:數據結構


進行以下矩陣運算:

結果R爲4*1的矩陣,這個矩陣就是新的顏色值,R中每一個通道的值分別以下:
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;spa

這樣看起來或許很抽象,很難理解顏色矩陣和結果R直接的關係,咱們假設顏色矩陣值以下所示:code

那麼結果爲:
R’ = R;
G’ = G;
B’ = B;
A’ = A;
也就是說,新的顏色值跟原先的同樣!再看一個例子,顏色矩陣取值爲:

結果爲:
R’ = R + 100;
G’ = G + 100;
B’ = B;
A’ = A;
新的顏色值中,紅色通道值和綠色通道值分別增長了100,此時圖片會泛黃(由於R + G = Yellow)。orm

從上面的幾個例子咱們很容易就能明白顏色矩陣中的每一個份量(每一列)的意義:
第一行決定紅色,
第二行決定綠色,
第三行決定藍色,
第四行決定了透明度,
第五列是顏色的偏移量。
至此咱們應該能理解如何經過顏色矩陣來改變顏色值的各個份量了。圖片

下面是用於Android的一段代碼,用於將圖片處理成泛黃的效果:開發

public static Bitmap testBitmap(Bitmap bitmap) {
  Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
    bitmap.getHeight(), Config.RGB_565);
  Canvas canvas = new Canvas(output);
  Paint paint = new Paint();
  ColorMatrix cm = new ColorMatrix();
  float[] array = { 1, 0, 0, 0, 100, 0, 1, 0, 0, 100, 0, 0, 1, 0, 0, 0,
    0, 0, 1, 0 };
  cm.set(array);
  paint.setColorFilter(new ColorMatrixColorFilter(cm));
  canvas.drawBitmap(bitmap, 0, 0, paint);
  return output;
 }
相關文章
相關標籤/搜索