先来看下原图
LightingColorFilter
R`= R * mul.R / 0xff + add.R
G`= G * mul.G / 0xff + add.G
B`= B * mul.B / 0xff + add.B
//将红色去除掉 new LightingColorFilter(0x00FFFF, 0x000000)
//将绿色去除掉 new LightingColorFilter(0xFF00FF, 0x000000)
//原始图片 new LightingColorFilter(0xFFFFFF, 0x000000);
//绿色更亮 new LightingColorFilter(0xFFFFFF, 0x003000);
LightingColorFilter lighting = new LightingColorFilter(0xFFFFFF, 0x003000);
mPaint.setColorFilter(lighting);
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
效果示意
PorterDuffColorFilter
将一个颜色和图层进行混合
比如,使图片添加红色并且更暗
PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.DARKEN);
mPaint.setColorFilter(porterDuffColorFilter);
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
效果示意
ColorMatrixColorFilter
色彩矩阵
在Android中,系统使用一个颜色矩阵ColorMatrix,来处理图像的这些色彩效果。Android中的颜色矩阵是一个45的数字矩阵,它用来对图片的色彩进行处理。而对于每个像素点,都有一个颜色分量矩阵来保存颜色的RGBA值,如图所示:
图中矩阵M就是一个45的颜色矩阵。在Android中,它会以一维数组的形式来存储,而C则是一个颜色矩阵分量。在处理图像时,使用矩阵乘法运算MC来处理颜色分量矩阵:
根据线性代数中的矩阵乘法运算法则,我们可以发现,颜色矩阵是按一下方式划分的
- 第一行的abcde值用来决定新的颜色值中的R——红色
- 第二行的fghij值用来决定新的颜色值中的G——绿色
- 第三行的klmno值用来决定新的颜色值中的B——蓝色
- 第四行的pqrst值用来决定新的颜色值中的A——透明度
- 矩阵M中的第五列——ejot值分别用来决定每个分量中的offset,即偏移量
我们来尝试一下
泛黄效果
float colormatrix_huan_huang[] = {
1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.5f, 0.0f, 0.0f,
0, 0, 0, 1.0f, 0
};
也可以使用如下这些内部使用色彩矩阵实现的API
亮度调节
ColorMatrix cm = new ColorMatrix();
cm.setScale(1,1,1,1);
mPaint.setColorFilter(colorMatrixColorFilter);
饱和度调节 0-无色彩 1-默认效果 >1饱和度加强
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(2);
mPaint.setColorFilter(colorMatrixColorFilter);
色度调节
0:修改红色 1:修改绿色 2:修改蓝色
ColorMatrix cm = new ColorMatrix();
cm.setRotate(0,45);
mPaint.setColorFilter(colorMatrixColorFilter);
以饱和度调节为例,传入参数2,可以看到饱和度明显提升