颜色矩阵ColorMatrix

QuibblerQuibbler 2024-01-16 约 7 分钟 1820 次阅读

颜色矩阵ColorMatrix

1、ColorMatrix

颜色矩阵ColorMatrix是一个用来表示三原色和透明度的4x5的矩阵。

1.1、介绍

将ColorMatrix表示为一个数组的形式如下:

[ a, b, c, d, e,
    f, g, h, i, j,
    k, l, m, n, o,
    p, q, r, s, t ]

一个颜色则使用 [R, G, B, A] 的方式进行表示,所以矩阵与颜色的计算方式则为:

从上述的公式可以看出,颜色矩阵的功能划分如下:

  • a, b, c, d, e 表示三原色中的红色

  • f, g, h, i, j 表示三原色中的绿色

  • k, l, m, n, o 表示三原色中的蓝色

  • p, q, r, s, t 表示颜色的透明度

  • 第五列用于表示颜色的偏移量

1.2、示例

首先,在不改变初始矩阵的情况下,来看一下图片的效果:

private ColorMatrix mColorMatrix;
    private Paint mPaint;
    private Bitmap oldBitmap;
    
    mColorMatrix = new ColorMatrix();
    mPaint = new Paint();
    
    // 设置画笔的颜色过滤器
    mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
    
    Log.d("TAG", Arrays.toString(mColorMatrix.getArray()));
    
    // 创建Bitmap
    oldBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.header);
    
    // 在画布上显示图片
    canvas.drawBitmap(oldBitmap,0,0,mPaint);
    
    // Log
    TAG: [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]

重新建立一个矩阵,使用 set 方法来使用这个矩阵,改变图片的颜色:

mColorMatrix.set(new float[]{
        1,0.5f,0,0,0
        ,0,1,0,0,0
        ,0,0,1,0,0
        ,0,0,0,1,0});

2、常用方法

举例介绍ColorMatrix的常用方法。

2.1、旋转

旋转方法:

/**
* 用于色调的旋转运算
* axis=0 表示色调围绕红色进行旋转
* axis=1 表示色调围绕绿色进行旋转
* axis=2 表示色调围绕蓝色进行旋转
*/
public void setRotate(int axis, float degrees)

2.2、放缩

ColorMatrix 的缩放方法,其实就是根据矩阵的运算规则,对 R、G、B、A 的数值分别进行缩放操作:

/**
    * rScale 表示红色的数值的缩放比例
    * gScale 表示绿色的数值的缩放比例
    * bScale 表示蓝色的数值的缩放比例
    * aScale 表示透明度的数值的缩放比例
    */
    public void setScale(float rScale, float gScale, float bScale,float aScale)

2.3、饱和度

setSaturation(float sat)方法可以根据一定比例,整体的增加或者减少颜色的饱和度,当设置0时,表示灰度图片;当设置为1时,表示颜色不变化。

/**
    * 设置矩阵颜色的饱和度
    *
    * sat 0表示灰度、1表示本身
    */
    public void setSaturation(float sat)

灰度图片的去色原理:只要把 RGB 的三色通道的数值设置为一样,即 R=G=B,那么图像就变成了灰色,同时为了保证图像的亮度,需要使同一个通道中的 R+G+B 的结果接近1。

  • 在 matlab 中按照 0.2989 R,0.5870 G 和 0.1140 B 的比例构成像素灰度值

  • 在 OpenCV 中按照 0.299 R, 0.587 G 和 0.114 B 的比例构成像素灰度值

  • 在 Android 中按照0.213 R,0.715 G 和 0.072 B 的比例构成像素灰度值

2.4、矩阵相乘

设置新的矩阵覆盖之前的内容,可以设置一个单独的矩阵,也可以设置两个矩阵的相乘。API如下:

public void set(ColorMatrix src)
    public void set(float[] src)
    public void setConcat(ColorMatrix matA, ColorMatrix matB)

此外,矩阵还有前乘方法:当前矩阵乘以输入的矩阵,相当于调用 setConcat(this, prematrix) 方法:

// 逻辑上相当于调用setConcat(this, prematrix)
    public void preConcat(ColorMatrix prematrix) {
        setConcat(this, prematrix);
    }

后乘方法,postConcat(prematrix) 方法相当于调用 setConcat(postmatrix, this):

// 逻辑上相当于调用setConcat(postmatrix, this)
    public void postConcat(ColorMatrix postmatrix) {
        setConcat(postmatrix, this);
    }

本文简单介绍了ColorMatrix 的原理和一些常用API方法,利用好使用巧妙可以达到很好的显示效果。比如之前界面实现全灰的效果中就用到了ColorMatrix 。

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w