標籤:android 影像處理
在Android中,對映像進行顏色方面的處理,如黑白老照片、泛黃舊照片、高對比、低飽和度等效果,都可以通過使用顏色矩陣(ColorMatrix)來實現。
1.顏色矩陣(ColorMatrix)介紹
顏色矩陣M是一個5*4的矩陣,1所示。在Android中,顏色矩陣M是以一維數組m=[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]的方式進行儲存的。
圖1 顏色矩陣M
在一張圖片中,映像的RGBA(紅色、綠色、藍色、透明度)值決定了該圖片所呈現出來的顏色效果。而映像的RGBA值則儲存在一個5*1的顏色分量矩陣C中,由顏色分量矩陣C可以控製圖像的顏色效果。顏色分量矩陣C2所示。
圖2 顏色分量矩陣C
要想改變一張圖片的顏色效果,只需要改變映像的顏色分量矩陣即可。通過顏色矩陣可以很方便的修改映像的顏色分量矩陣。假設修改後的映像顏色分量矩陣為C1,則有3所示的顏色分量矩陣計算公式。
圖3 顏色分量矩陣計算公式
由此可見,通過顏色矩陣修改了原映像的RGBA值,從而達到了改變圖片顏色效果的目的。並且,通過3所示的運算可知,顏色矩陣M的第一行參數abcde決定了映像的紅色成分,第二行參數fghij決定了映像的綠色成分,第三行參數klmno決定了映像的藍色成分,第四行參數pqrst決定了映像的透明度,第五列參數ejot是顏色的位移量。
通常,改變顏色分量時可以通過修改第5列的顏色位移量來實現,4所示的顏色矩陣M1,通過計算後可以得知該顏色矩陣的作用是使映像的紅色分量和綠色分量均增加100,這樣的效果就是圖片泛黃(因為紅色與綠色混合後得到黃色)。
圖4 顏色矩陣M1
除此之外,也可以通過直接對顏色值乘以某一係數而達到改變顏色分量的目的。5所示的顏色矩陣M2,將綠色分量放大了2倍,這樣的效果就是圖片泛綠色。
圖5 顏色矩陣M2
2.映像顏色處理執行個體
瞭解了顏色矩陣的工作原理之後,我們就可以使用顏色矩陣對圖片進行處理了。
布局代碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 android:paddingLeft="@dimen/activity_horizontal_margin" 8 android:paddingRight="@dimen/activity_horizontal_margin" 9 android:paddingTop="@dimen/activity_vertical_margin"10 tools:context=".MainActivity" >11 12 <TextView13 android:layout_width="wrap_content"14 android:layout_height="wrap_content"15 android:text="R" />16 17 <SeekBar18 android:id="@+id/sb_red"19 android:layout_width="match_parent"20 android:layout_height="wrap_content"21 android:max="255"22 android:progress="128" />23 24 <TextView25 android:layout_width="wrap_content"26 android:layout_height="wrap_content"27 android:text="G" />28 29 <SeekBar30 android:id="@+id/sb_green"31 android:layout_width="match_parent"32 android:layout_height="wrap_content"33 android:max="255"34 android:progress="128" />35 36 <TextView37 android:layout_width="wrap_content"38 android:layout_height="wrap_content"39 android:text="B" />40 41 <SeekBar42 android:id="@+id/sb_blue"43 android:layout_width="match_parent"44 android:layout_height="wrap_content"45 android:max="255"46 android:progress="128" />47 48 <TextView49 android:layout_width="wrap_content"50 android:layout_height="wrap_content"51 android:text="A" />52 53 <SeekBar54 android:id="@+id/sb_alpha"55 android:layout_width="match_parent"56 android:layout_height="wrap_content"57 android:max="255"58 android:progress="128" />59 60 <ImageView61 android:id="@+id/iv_show"62 android:layout_width="wrap_content"63 android:layout_height="wrap_content"64 android:src="@drawable/painter" />65 66 </LinearLayout>複製代碼
實現代碼:
1 package cn.bgxt.colormatrixdemo; 2 3 import android.os.Bundle; 4 import android.util.Log; 5 import android.widget.ImageView; 6 import android.widget.SeekBar; 7 import android.widget.SeekBar.OnSeekBarChangeListener; 8 import android.app.Activity; 9 import android.graphics.Bitmap;10 import android.graphics.BitmapFactory;11 import android.graphics.Canvas;12 import android.graphics.ColorMatrix;13 import android.graphics.ColorMatrixColorFilter;14 import android.graphics.Matrix;15 import android.graphics.Paint;16 17 public class MainActivity extends Activity {18 private SeekBar sb_red, sb_green, sb_blue,sb_alpha;19 private ImageView iv_show;20 private Bitmap afterBitmap;21 private Paint paint;22 private Canvas canvas;23 private Bitmap baseBitmap;24 25 @Override26 protected void onCreate(Bundle savedInstanceState) {27 super.onCreate(savedInstanceState);28 setContentView(R.layout.activity_main);29 30 iv_show = (ImageView) findViewById(R.id.iv_show);31 sb_red = (SeekBar) findViewById(R.id.sb_red);32 sb_green = (SeekBar) findViewById(R.id.sb_green);33 sb_blue = (SeekBar) findViewById(R.id.sb_blue);34 sb_alpha = (SeekBar) findViewById(R.id.sb_alpha);35 36 sb_red.setOnSeekBarChangeListener(seekBarChange);37 sb_green.setOnSeekBarChangeListener(seekBarChange);38 sb_blue.setOnSeekBarChangeListener(seekBarChange);39 sb_alpha.setOnSeekBarChangeListener(seekBarChange);40 41 // 從資源檔中擷取圖片42 baseBitmap = BitmapFactory.decodeResource(getResources(),43 R.drawable.painter);44 // 擷取一個與baseBitmap大小一致的可編輯的空圖片45 afterBitmap = Bitmap.createBitmap(baseBitmap.getWidth(),46 baseBitmap.getHeight(), baseBitmap.getConfig());47 canvas = new Canvas(afterBitmap);48 paint = new Paint();49 }50 51 private SeekBar.OnSeekBarChangeListener seekBarChange = new OnSeekBarChangeListener() {52 53 @Override54 public void onStopTrackingTouch(SeekBar seekBar) {55 // 擷取每個SeekBar當前的值56 float progressR = sb_red.getProgress()/128f;57 float progressG = sb_green.getProgress()/128f;58 float progressB = sb_blue.getProgress()/128f;59 float progressA=sb_alpha.getProgress()/128f;60 Log.i("main", "R:G:B="+progressR+":"+progressG+":"+progressB);61 // 根據SeekBar定義RGBA的矩陣62 float[] src = new float[]{63 progressR, 0, 0, 0, 0, 64 0, progressG, 0, 0, 0,65 0, 0, progressB, 0, 0, 66 0, 0, 0, progressA, 0};67 // 定義ColorMatrix,並指定RGBA矩陣68 ColorMatrix colorMatrix = new ColorMatrix();69 colorMatrix.set(src);70 // 設定Paint的顏色71 paint.setColorFilter(new ColorMatrixColorFilter(src));72 // 通過指定了RGBA矩陣的Paint把原圖畫到空白圖片上73 canvas.drawBitmap(baseBitmap, new Matrix(), paint);74 iv_show.setImageBitmap(afterBitmap);75 }76 77 @Override78 public void onStartTrackingTouch(SeekBar seekBar) {79 }80 81 @Override82 public void onProgressChanged(SeekBar seekBar, int progress,83 boolean fromUser) {84 }85 };86 }
:
android把彩色映像變成灰階圖(黑白)
代碼:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ImageView iv = new ImageView(this); setContentView(iv); Bitmap originImg = BitmapFactory.decodeResource(getResources(), R.drawable.painter); Bitmap grayImg = Bitmap.createBitmap(originImg.getWidth(), originImg.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(grayImg); Paint paint = new Paint(); ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0); ColorMatrixColorFilter colorMatrixFilter = new ColorMatrixColorFilter(colorMatrix); paint.setColorFilter(colorMatrixFilter); canvas.drawBitmap(originImg, 0, 0, paint); iv.setImageBitmap(grayImg); }}
主要是 colorMatrix.setSaturation(0);這一行代碼的作用。
,還是剛才的彩色圖處理後的結果:
黑白老照片、泛黃舊照片、高對比、低飽和度等效果
泛紅效果
高對比、高飽和度、色相變換等圖片處理效果
Android ColorMatrix類映像顏色處理-黑白老照片、泛黃舊照片、高對比等效果