ColorMatrix(颜色滤镜)介绍和使用

本文详细介绍如何使用色彩矩阵(Color Matrix)来调整图像的颜色属性,包括去除特定颜色、实现反相效果等,并提供了具体的代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

颜色矩阵,对每一个像素点的颜色(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,
        });

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值