Android ColorMatrix類映像顏色處理-黑白老照片、泛黃舊照片、高對比等效果

來源:互聯網
上載者:User

標籤: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類映像顏色處理-黑白老照片、泛黃舊照片、高對比等效果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.