颜色矩阵,对每一个像素点的颜色(ARGB)进行更改,像ps一样的改变图像的颜色。因为运算大量的像素点,colorMatrix是native方法。
这里主要是讲怎么使用。
一。先看下面色彩矩阵表示方式
看看运行效果,将上面的色块进行矩阵变换,去掉了红色元素,透明度变为之前的0.8f,矩阵代码如下:
matrix.set(new float[]{
1,0,0, 0, 0,
0,0,0, 0, 0,
0,0,1, 0, 0,
0,0,0, 0.8f,0,
});
使用起来很方便,所有的代码如下:
public ColorFilterView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.rgb(82, 173, 125));
rect = new Rect(20, 20, 350, 350);
//第二个色块
paint1 = new Paint(Paint.ANTI_ALIAS_FLAG);
rect1 = new Rect(20, 20, 350, 350);
//设置颜色过滤矩阵,不增加颜色增量,去掉green
//只保留红色,blue原来的0.9,
ColorMatrix matrix = new ColorMatrix();
matrix.set(new float[]{
1,0,0, 0, 0,
0,0,0, 0, 0,
0,0,1, 0, 0,
0,0,0, 0.8f,0,
});
matrix.setRotate(2,170);
ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(matrix);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(rect, paint);
canvas.translate(0,400);
canvas.drawRect(rect1,paint1);
}
—–单调的颜色看不出问题,下面使用图片的效果,左边去是抽掉Red色素右边是去掉Green的色素的效果图—–
—-代码如下——
//设置颜色过滤矩阵,不增加颜色增量,去掉green
ColorMatrix matrix = new ColorMatrix();
matrix.set(new float[]{
1,0,0, 0, 0,
0,0,0, 0, 0,
0,0,1, 0, 0,
0,0,0, 1, 0,
});
ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(matrix);
paint1.setColorFilter(colorFilter);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.meinv);
rect2 = new Rect(20,20,20+bitmap.getWidth(),20+bitmap.getHeight());
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(bitmap,rect2, rect2, paint);
canvas.translate(0,bitmap.getHeight()+30);
canvas.drawBitmap(bitmap,rect2,rect2,paint1);
}
—-第三种反相效果—–
反相效果是比如原来RGB色素分别是:100、200、150;
反相后的RGB色素值分别是:155、55、 105;
前后加起来的刚好是255.
下面是矩阵代码,注意按Red、Green、Blue的分量到了最大,系数为-1.
matrix.set(new float[]{
-1, 0, 0, 0, 255,
0,-1, 0, 0, 255,
0, 0,-1, 0, 255,
0, 0, 0, 1, 0,
});
//复古效果
matrix.set(new float[]{
1 / 2f, 1 / 2f, 1 / 2f, 0, 0,
1 / 3f, 1 / 3f, 1 / 3f, 0, 0,
1 / 4f, 1 / 4f, 1 / 4f, 0, 0,
0, 0, 0, 1, 0,
});
—-反色效果——
Red和Green的位置替换
matrix.set(new float[]{
0, 1f, 0, 0, 0,
1f, 0, 0, 0, 0,
0, 0, 1f, 0, 0,
0, 0, 0, 1f, 0,
});