筆記如下
如圖:
Video_2018-03-16_102658.gif
實現步驟:
1.首先了解顏色矩陣
2.修改paint的顏色來調節顏色什么是顏色矩陣呢?
5x4 matrix for transforming the color+alpha components of a Bitmap. The matrix is stored in a single array, and its treated as follows:
[ a, b, c, d, e, //這一行專門處理紅色的色系
f, g, h, i, j, //這一行專門處理綠色的色系
k, l, m, n, o, //這一行專門處理藍色的色系
p, q, r, s, t ]
When applied to a color [r, g, b, a], the resulting color is computed as (after clamping)
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; //透明度
Set this colormatrix to identity:
[ 1 0 0 0 0 - red vector
0 1 0 0 0 - green vector
0 0 1 0 0 - blue vector
0 0 0 1 0 ] - alpha vector
接下來就是具體的設置方法
//redPercent,greenPercent ,bluePercent 初始為1,這樣就可以動態的改變指定要改變的顏色
if (seekBar == skb_red){
this.redPercent = percent;
}else if(seekBar == skb_green){
this.greenPercent = percent;
}else if(seekBar == skb_blue){
this.bluePercent = percent;
}
Paint paint = new Paint();
//2.去處理圖片的顏色
//設置顏色過濾
//vactor是0-2的區間
//下面這個是畫筆顏色矩陣規則,也就是調節顏色的,
float[] cm = new float[]{
1 * redPercent,0,0,0,0,//red vactor
0,1 * greenPercent,0,0,0,//green vactor
0,0,1 * bluePercent,0,0,//blue vactor
0,0,0,1,0,//alpha vactor
};
paint.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix(cm)));
實現源碼:
layout中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
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" tools:context="com.chen.color.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="靑----------------------------------------紅"
/>
<SeekBar
android:progress="50"
android:id="@+id/skb_red"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="紫---------------------------------------綠"
/>
<SeekBar
android:progress="50"
android:id="@+id/skb_green"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="黃--------------------------------------藍"
/>
<SeekBar
android:progress="50"
android:id="@+id/skb_blue"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/iv"
/>
</LinearLayout>
MainActivity中
package com.chen.color;
import android.Manifest;
import android.content.pm.PackageManager;
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;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
private ImageView iv;
private SeekBar skb_red;
private SeekBar skb_green;
private SeekBar skb_blue;
private Bitmap srcBitmap;
private float redPercent = 1f;
private float greenPercent = 1f;
private float bluePercent = 1f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
skb_red = (SeekBar) findViewById(R.id.skb_red);
skb_green = (SeekBar) findViewById(R.id.skb_green);
skb_blue = (SeekBar) findViewById(R.id.skb_blue);
//andorid6.0及以上,需要動態過去權限
requestPermission();
skb_red.setOnSeekBarChangeListener(this);
skb_green.setOnSeekBarChangeListener(this);
skb_blue.setOnSeekBarChangeListener(this);
String path = "storage/emulated/0/6.jpg";
srcBitmap = BitmapFactory.decodeFile(path);
Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth()*2,srcBitmap.getHeight()*2,srcBitmap.getConfig());
Canvas canvas = new Canvas(copyBitmap);
Paint paint = new Paint();
Matrix matrix = new Matrix();
matrix.setScale(2f,2f);
canvas.drawBitmap(srcBitmap,matrix,paint);
iv.setImageBitmap(copyBitmap);
}
private void requestPermission(){
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ //表示未授權時
//進行授權
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
}else{
//調用打電話的方法
Toast.makeText(this, "已經獲取了..", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// seek的進度改變的回調
//停止拖動seekbar的回調
float percent = progress / 50f;
if (seekBar == skb_red){
this.redPercent = percent;
}else if(seekBar == skb_green){
this.greenPercent = percent;
}else if(seekBar == skb_blue){
this.bluePercent = percent;
}
//去改變圖片的顏色
//1.去獲得拷貝
Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth()*2,srcBitmap.getHeight()*2,srcBitmap.getConfig());
Canvas canvas = new Canvas(copyBitmap);
Paint paint = new Paint();
//2.去處理圖片的顏色
//設置顏色過濾
//vactor是0-2的區間
//下面這個是畫筆顏色矩陣規則,也就是調節顏色的,
float[] cm = new float[]{
1 * redPercent,0,0,0,0,//red vactor
0,1 * greenPercent,0,0,0,//green vactor
0,0,1 * bluePercent,0,0,//blue vactor
0,0,0,1,0,//alpha vactor
};
paint.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix(cm)));
Matrix matrix = new Matrix();
matrix.setScale(2f,2f);
canvas.drawBitmap(srcBitmap,matrix,paint);
//3.將處理的結果展示
iv.setImageBitmap(copyBitmap);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
//開始拖動seekBar的回調
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
/*//停止拖動seekbar的回調
int progress = seekBar.getProgress();
float percent = progress / 50f;
if (seekBar == skb_red){
this.redPercent = percent;
}else if(seekBar == skb_green){
this.greenPercent = percent;
}else if(seekBar == skb_blue){
this.bluePercent = percent;
}
//去改變圖片的顏色
//1.去獲得拷貝
Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth()*2,srcBitmap.getHeight()*2,srcBitmap.getConfig());
Canvas canvas = new Canvas(copyBitmap);
Paint paint = new Paint();
//2.去處理圖片的顏色
//設置顏色過濾
//vactor是0-2的區間
//下面這個是畫筆顏色矩陣規則,也就是調節顏色的,
float[] cm = new float[]{
1 * redPercent,0,0,0,0,//red vactor
0,1 * greenPercent,0,0,0,//green vactor
0,0,1 * bluePercent,0,0,//blue vactor
0,0,0,1,0,//alpha vactor
};
paint.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix(cm)));
Matrix matrix = new Matrix();
matrix.setScale(2f,2f);
canvas.drawBitmap(srcBitmap,matrix,paint);
//3.將處理的結果展示
iv.setImageBitmap(copyBitmap);*/
}
}