Android ColorFilter:PorterDuffColorFilter、LightingColorFilter、ColorMatrixColorFilter

本文深入探讨了图像处理和特效技术,包括OpenGL ES滤镜、OpenCV图像处理、人脸标定AR等核心内容,提供了从理论到实践的全面指南。

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

效果就是可以在原图基础上,变换颜色。


ImageView、ImageButton、Drawable,以及Paint 都有setColorFilter方法


ColorFilter



setColorFilter(int color);

setColorFilter(int clor, Mode mode); //mode 就是 PorterDuff.Mode   指示ColorFilter如何展示,其对应的color就是src层。

            关于PorterDuff.Mode ,详见(http://blog.csdn.net/jjwwmlp456/article/details/46912561)

setColorFilter(ColorFilter filter);


PorterDuffColorFilter

以PorterDuff.mode 模式进行混合图像的颜色

public PorterDuffColorFilter(@ColorInt int color, @NonNull PorterDuff.Mode mode)
指定一个用于混合的ARGB颜色值color,及相应的混合mode 参与构造


LightingColorFilter 只是修改RGB值,alpha值被忽略;构造时要指定两个色值,先混合第一种颜色,再混合第二种,所以色值的顺序不一样,结果也不一定一样

public LightingColorFilter(int mul, int add)
构造参数:mul,用于乘法;add,用于加法。 关于乘法和加法运算,可以参考下面的ColorMatrix

ColorMatrixColorFilter

public ColorMatrixColorFilter(ColorMatrix matrix)

以ColorMatrix为基础进行颜色变换。


ColorMatrix 颜色矩阵

public ColorMatrix() {
   reset(); //重置
/* 
reset():
 [ 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
 
*/
}
public ColorMatrix(float[] src) {
   ...
}
public ColorMatrix(ColorMatrix src) {//基于一个ColorMatrix 进行构造
   ...
}

其构造方法需要一个数组,其实就是一个4x5的矩阵,用来对bitmap的颜色和alpha进行转换。形式如下:

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

计算规则:

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;

即前四列,为RGBA,用于在source的基础上进行相乘;后一列用于相加


如下,对RGB取反色,即源图像的RGB区都乘以-1再加255:

 [ -1, 0, 0, 0, 255,
   0, -1, 0, 0, 255,
   0,  0, -1, 0, 255,
   0,  0,  0, 1,  0 ]

ColorMatrix的主要方法

set(float[] src); 设置颜色矩阵数组

set(ColorMatrix src); 设置颜色矩阵

setConcat(ColorMatrix a, ColorMatrix b;连结ab两个颜色矩阵;效果为先应用b,再应用a

setRGB2YUV(); 将RGB矩阵转为YUV(与RGB类似,是一种颜色编码方案)矩阵

setYUV2RGB();将YUV(与RGB类似,是一种颜色编码方案)矩阵转为RGB矩阵

setSaturation(float sat);设置色彩的饱和度(百科中说:对于人的视觉,每种色彩的饱和度可分为20个可分辨等级

setScale(float rScale, float gScale, float bScale, float aScale);设置用于缩放(即乘法)的RGBA值,原始比例为1

setRotate(int axis, float degrees);绕axis轴旋转degrees度;axis:0为RED,1为GREEN,2为BLUE


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值