編輯:Android開發實例
前言
本文講解如何通過改變圖片像素點RGB的值的方式,在Android中改變圖片的顏色。在最後將以一個簡單的Demo來作為演示。
本文的主要內容:
ColorMatrix
在Android中,圖片是以一個個RGBA的像素點的形式加載到內存中的,所以如果需要改變圖片的顏色,就需要針對這一個個像素點的RGBA的值進行修改,其實主要是RGB,A是透明度。在Android下,修改圖片RGBA的值需要ColorMatrix類的支持,它定義了一個5*4的float[]類型的矩陣,矩陣中每一行表示RGBA中的一個參數。
一般常用指定ColorMatrix的RGBA值的方式有兩種:
下面是定義了一個不修改的原圖的RGBA的ColorMatrix。
- ColorMatrix colorMatrix = new ColorMatrix();
- colorMatrix.set(new float[] {
- 1, 0, 0, 0, 0,
- 0, 1, 0, 0, 0,
- 0, 0, 1,0, 0,
- 0, 0, 0, 1, 0
- });
可以看到,代碼中,第三行定義的是R,第四行定義的是G,第五行定義的是B,第六行定義的是A。在定義的時候,需要注意數組的順序必須正確。
這個矩陣定義的是一連串float數組,其中不同的位置代表了不同的RGBA值,它的范圍在0.0f~2.0f之間,1為保持原圖的RGBA值。
使用ColorMatrix改變圖片顏色的步驟
上面介紹了ColorMatrix設置圖片的顏色,但是僅僅使用它還無法完成圖片顏色的修改,需要配合Canvas和Paint使用,具體步驟如下:
需要說明一下的是Paint.setColorFilter()方法傳遞的是一個ColorFilter對象,可以使用它的子類ColorMatrixColorFilter包裝我們定義好的ColorMatrix。
改變圖片RGBA值的Demo
上面已經簡單講解了如何使用ColorMatrix定義一個RGBA值的矩陣,然後介紹了使用ColorMatrix的步驟,下面通過一個簡單的Demo來演示如何使用它。在Demo中定義了四個SeekBar,分別代表RGBA,拖動其中的某個SeekBar,改變位圖原本的顏色。注釋都比較全,這裡就不再贅述了。
布局代碼:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context=".MainActivity" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="R" />
- <SeekBar
- android:id="@+id/sb_red"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:max="255"
- android:progress="128" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="G" />
- <SeekBar
- android:id="@+id/sb_green"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:max="255"
- android:progress="128" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="B" />
- <SeekBar
- android:id="@+id/sb_blue"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:max="255"
- android:progress="128" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="A" />
- <SeekBar
- android:id="@+id/sb_alpha"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:max="255"
- android:progress="128" />
- <ImageView
- android:id="@+id/iv_show"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/painter" />
- </LinearLayout>
實現代碼:
- package cn.bgxt.colormatrixdemo;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.ImageView;
- import android.widget.SeekBar;
- import android.widget.SeekBar.OnSeekBarChangeListener;
- import android.app.Activity;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.ColorMatrix;
- import android.graphics.ColorMatrixColorFilter;
- import android.graphics.Matrix;
- import android.graphics.Paint;
- public class MainActivity extends Activity {
- private SeekBar sb_red, sb_green, sb_blue,sb_alpha;
- private ImageView iv_show;
- private Bitmap afterBitmap;
- private Paint paint;
- private Canvas canvas;
- private Bitmap baseBitmap;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- iv_show = (ImageView) findViewById(R.id.iv_show);
- sb_red = (SeekBar) findViewById(R.id.sb_red);
- sb_green = (SeekBar) findViewById(R.id.sb_green);
- sb_blue = (SeekBar) findViewById(R.id.sb_blue);
- sb_alpha = (SeekBar) findViewById(R.id.sb_alpha);
- sb_red.setOnSeekBarChangeListener(seekBarChange);
- sb_green.setOnSeekBarChangeListener(seekBarChange);
- sb_blue.setOnSeekBarChangeListener(seekBarChange);
- sb_alpha.setOnSeekBarChangeListener(seekBarChange);
- // 從資源文件中獲取圖片
- baseBitmap = BitmapFactory.decodeResource(getResources(),
- R.drawable.painter);
- // 獲取一個與baseBitmap大小一致的可編輯的空圖片
- afterBitmap = Bitmap.createBitmap(baseBitmap.getWidth(),
- baseBitmap.getHeight(), baseBitmap.getConfig());
- canvas = new Canvas(afterBitmap);
- paint = new Paint();
- }
- private SeekBar.OnSeekBarChangeListener seekBarChange = new OnSeekBarChangeListener() {
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- // 獲取每個SeekBar當前的值
- float progressR = sb_red.getProgress()/128f;
- float progressG = sb_green.getProgress()/128f;
- float progressB = sb_blue.getProgress()/128f;
- float progressA=sb_alpha.getProgress()/128f;
- Log.i("main", "R:G:B="+progressR+":"+progressG+":"+progressB);
- // 根據SeekBar定義RGBA的矩陣
- float[] src = new float[]{
- progressR, 0, 0, 0, 0,
- 0, progressG, 0, 0, 0,
- 0, 0, progressB, 0, 0,
- 0, 0, 0, progressA, 0};
- // 定義ColorMatrix,並指定RGBA矩陣
- ColorMatrix colorMatrix = new ColorMatrix();
- colorMatrix.set(src);
- // 設置Paint的顏色
- paint.setColorFilter(new ColorMatrixColorFilter(src));
- // 通過指定了RGBA矩陣的Paint把原圖畫到空白圖片上
- canvas.drawBitmap(baseBitmap, new Matrix(), paint);
- iv_show.setImageBitmap(afterBitmap);
- }
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress,
- boolean fromUser) {
- }
- };
- }
效果展示:
源碼下載
在Android上開發一些小應用既可以積累知識又可以增加樂趣,與任務式開發不同
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
具體代碼如下: main.xml 代碼如下:<LinearLayout xmlns:android=http://schemas.android.com/
我們在進行Android開發時往往需要訪問SD卡的內容,而且因為文件很多,希望