標籤:
最近的學習過程中看到關於android色彩矩陣的內容,以前看到這部分內容,基本都是跳過的,沒有認真細讀。
自己給自己找的借口是:
1,大一學的矩陣內容早就忘的乾乾淨淨了,當時學的時候就很煩人,所以現在也乾脆跳過別看吧,反正自己目前又不沒有做影像處理之類的任務。
2,Android中色彩方面,有現成的setSaturation—設定飽和度,setScale—色彩縮放,setRotate—色彩旋轉方法了,沒必要去學ColorMatrix吧。
當然,後來還是對這種借口進行了反思,不能一直逃避矩陣有關的內容吧,於是掏出大一的《線性代數》,翻了翻矩陣的相關知識。
以下總結的矩陣的一些簡單知識,並不深入,但是屬於一個開發人員應該掌握的程度。
一:矩陣的來源: 我們都知道矩陣的形式
但是矩陣的來源是什麼呢,其實矩陣最早來自於方程組的係數及常數所構成的方陣。
比如:
對應的矩陣陣列:
這個矩陣陣列有什麼用呢?不要小看了這個矩陣,這裡矩陣決定著這個方程組是否有解,以及如果有 解,解是什麼。
也就是說利用矩陣可以對線性方程組進行方便快速地求解。
二:矩陣的運算
矩陣的加法:
矩陣的乘法:
加法運算條件必須是同型矩陣,乘法條件是A是m×n矩陣,B是n×p矩陣。
瞭解了這些基本的矩陣概念,再來看Android中的ColorMatrix。
大家都知道在Android圖片中採用ARGB來表示顏色,圖片中每一個點都有自己的RGBA值,將這個RGBA值 當成只有一列的矩陣,讓這個矩陣
乘上另外一個矩陣得到變化,以改變圖片顏色,這裡的另一個矩陣就是ColorMatrix。
首先,根據矩陣乘法,我們覺得一個4*4的ColorMatrix就可以了,
比如:
但是問什麼最後ColorMatrix用了4*5的矩陣。原因看圖:
e,j,o,t是沒有係數的,當我們想增加某一個屬性而不影響其他時,只需要修改e,j,o,t的值。
基本用法:
ColorMatrix colorMatrix = new ColorMatrix(new float[]{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, }); mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
實戰演練:
1,我們想實現去除藍色的效果
只要設定ColorMatrix為
ColorMatrix colorMatrix = new ColorMatrix(new float[]{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, });
這樣原來圖片的RGBA的那個矩陣和colorMatrix相乘得到的結果是RG0A,沒有B了。
效果我們這裡使用了一個《android群英傳》裡一個關於ColorMatrix學習的小工具:
https://github.com/xurui1995/ColorMatrixStudy
關鍵代碼:
// 將矩陣值設定到映像 private void setImageMatrix() { Bitmap bmp = Bitmap.createBitmap( bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); android.graphics.ColorMatrix colorMatrix = new android.graphics.ColorMatrix(); colorMatrix.set(mColorMatrix); Canvas canvas = new Canvas(bmp); Paint paint = new Paint(); paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); canvas.drawBitmap(bitmap, 0, 0, paint); mImageView.setImageBitmap(bmp); }
效果:
這時候你肯定想:臥槽,怎麼這麼黃?沒關係,給你看一張圖你就馬上懂了。
2,根據ColorMatrix回答變化效果
答案顯而易見:第一個效果是綠色加強一倍。第二個效果是增強紅和綠各100分量。
3,一些其他"特效",你可以嘗試更多。
Android的矩陣(一):ColorMatrix