在Android中,对Bitmap进行颜色方面的处理可以通过ColorMatrix类来实现。位图bitmap是由一个个像素点组成,每一个像素点都会有其对应的颜色值——RGBA,分别对应红、绿、蓝、透明度这四个分量。它们共同决定了每个像素点显示的颜色,而ColorMatrix可以很好的支持RGBA的操作。
1、ColorMatrix介绍
源码上是这样解释的:
意思是说:“这是一个4*5的矩阵,可以对位图的颜色和透明度进行转换。”
颜色的计算:通过矩阵相乘可以得到,计算如下:A矩阵就是ColorMatrix,C矩阵是色彩矩阵,R为结果。
矩阵乘法结果:
2、如何使用
如果我们想整体的改变一张图像的颜色,不可能对这张图像的每一个像素点分别与色彩矩阵相乘。官方已有封装好的API—-Paint类的setColorFilter(ColorFilter filter)方法,即:设置颜色过滤。
ColorFilter类有3个子类:ColorMatrixColorFilter, LightingColorFilter, PorterDuffColorFilter。其中ColorMatrixColorFilter就是我们需要使用的。具体代码如下:
ColorMatrix colorMatrix = new ColorMatrix();
//这里可以设置需要的功能
//colorMatrix.setSaturation(sat);
//colorMatrix.setScale( rScale, gScale, bScale, aScale);
//colorMatrix.setRotate(axis,degrees);
ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
Paint paint = new Paint();
paint.setColorFilter(colorFilter);
完整的工具类代码:
package com.lc.dealpic.util;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
public class ColorMatrixUtils {
public static Bitmap setConcat(Bitmap bitmap,ColorMatrix matA,ColorMatrix matB){
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.reset();
colorMatrix.setConcat(matA,matB);
colorMatrix.setConcat(matA,matB);
ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
return createNewBitmap(bitmap,colorFilter);
}
public static Bitmap setRotate(Bitmap bitmap,int axis, float degrees){
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.reset();
ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
return createNewBitmap(bitmap,colorFilter);
}
public static Bitmap setScale(Bitmap bitmap,float rScale, float gScale, float bScale,float aScale){
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.reset();
colorMatrix.setScale( rScale, gScale, bScale, aScale);
ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
return createNewBitmap(bitmap,colorFilter);
}
public static Bitmap setSaturation(Bitmap bitmap, float sat) {
/*
ColorMatrix :4 x5矩阵,用于改变位图的颜色和透明度
*/
ColorMatrix colorMatrix = new ColorMatrix();
//设置颜色矩阵的饱和度,0是灰色的,1是原图
//设置图像的饱和度,范围: 0<=sat<=1,0是灰色的,1是原图
colorMatrix.setSaturation(sat);
ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
return createNewBitmap(bitmap,colorFilter);
}
private static Bitmap createNewBitmap(Bitmap bitmap, ColorMatrixColorFilter colorFilter) {
// 得到图片的长和宽
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Bitmap newBit = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(newBit);
Paint paint = new Paint();
paint.setColorFilter(colorFilter);
canvas.drawBitmap(bitmap, 0, 0, paint);
return newBit;
}
}