ColorFilter 简介
文章目录
- 1、概述
- 2、ColorMatrixColorFilter
- 3、 LightingColorFilter
- 4、PorterDuffColorFilter
1、概述
ColorFilter主要用来处理颜色,这里将讲解它的三个子类,ColorMatrixColorFilter,
LightingColorFilter以及PorterDuffColorFilter。
2、ColorMatrixColorFilter
这个类主要是使用matrix也就是矩阵对颜色做运算,矩阵的形态如下:
颜色值和该矩阵的换算关系如下:
RGB和Alpha的终值计算方法如下:
Red通道终值= a[0] * srcR + a[1] * srcG + a[2] * srcB + a[3] * srcA + a[4]
Green通道终值= a[5] * srcR + a[6] * srcG + a[7] * srcB + a[8] * srcA + a[9]
Blue通道终值= a[10] * srcR + a[11] * srcG + a[12] * srcB + a[13] * srcA + a[14]
Alpha通道终值= a[15]*srcR+a[16]*srcG + a[17] * srcB + a[18] * srcA + a[19]备注: srcR为原图Red通道值,srcG为原图Green通道值,srcB为原图Blue通道值,srcA为原图Alpha通道值。
每个通道的源值和终值都在0到255的范围内。即使计算结果大于255或小于0,值都将被限制在0到255的范围内。
看了上面的说明可能不太清晰,这里再看看例子,
上面有3张图片,其实是同一个图片绘制的,只是使用了不同的ColorMatrixColorFilter,最后面一张是完全黑白的。
看看代码的实现:
private final static float[] MATRIX = new float[] {0.5f, 0, 0, 0, 0,0, 0.5f, 0, 0, 0,0, 0, 0.5f, 0, 0,0, 0, 0, 1, 0 };Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.home);canvas.drawBitmap(bitmap, 100, 0, paint);ColorMatrixColorFilter filter = new ColorMatrixColorFilter(MATRIX);
paint.setColorFilter(filter);
canvas.drawBitmap(bitmap, 100, 500, paint);ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(0);
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
canvas.drawBitmap(bitmap, 100, 1000, paint);
MATRIX中的值是0.5使得R,G,B通道的值都减半了,所以第二张图看起来暗了很多
第三张图使用了ColorMatrix,并且使用colorMatrix.setSaturation(0)将饱和度设置为了0,这样一来就变为了黑白图片。
明白了上面颜色运算的规则,就可以自己更改矩阵的值从而达到想要的效果。这里举一个示例
3、 LightingColorFilter
LightingColorFilter是上面ColorMatrixColorFilter的一个简化版本,构造函数也比较简单:
public LightingColorFilter(int mul, int add)
mul代表multiply,也就是乘法
add代表加法,也就是颜色偏移量
那么这里将怎么计算颜色值呢,其实跟上面矩阵的方式差不多。这里两个参数都是int类型,所以每8位被分别分解为RGB对应的值来做乘法和加法。
先来看一个 例子:
看一下代码实现:
Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.home);canvas.drawBitmap(bitmap, 100, 0, paint);LightingColorFilter filter = new LightingColorFilter(0x888888, 0x000000);
paint.setColorFilter(filter);
canvas.drawBitmap(bitmap, 100, 500, paint);LightingColorFilter filter2 = new LightingColorFilter(0x888888, 0x555555);
paint.setColorFilter(filter2);
canvas.drawBitmap(bitmap, 100, 1000, paint);
看第二张图片的ColorFilter构造new LightingColorFilter(0x888888, 0x000000);
其中mul为0x888888,那么RGB通道对应的mul值都为88,add为0x000000则对应的偏移量都为0。第二张图变暗了,基本可以看出计算方法。
color = colormul/255+add (计算结果大于等于255都指定为255)
其中color可以为RGB三种通道中的一种,mul和add分别为通道对应的值。假设R通道的值就为
R=R0x88/0xff+0
0x88/0xff肯定是小于1的,所以颜色变暗了。
第三张图的mul值和第二张相同,但是由于第三张图的add值比较大,所以反而比第一张图还亮。
4、PorterDuffColorFilter
看他的构造函数
public PorterDuffColorFilter(int srcColor, PorterDuff.Mode mode)
srcColor源颜色,
mode是色彩的混合模式,这里的混合模式我们在后面再详细讲解,这里简单看一个示例。
看看代码实现:
Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.home);canvas.drawBitmap(bitmap, 100, 0, paint);PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.MULTIPLY);
paint.setColorFilter(filter);
canvas.drawBitmap(bitmap, 100, 500, paint);
这里PorterDuffColorFilter的两个参数分别是Color.BLUE以及PorterDuff.Mode.MULTIPLY
先不要纠结PorterDuff.Mode.MULTIPLY的含义,这里主要是将Color.BLUE提供的蓝色和原图进行一定的合并运算。就得到了上面的效果,那么传入不同PorterDuff.Mode值就能得到不同的效果。各个值不同的效果我们在后面的篇幅中详细讲解。
文章转载:
ColorFilter
ColorFilter 简介相关推荐
- 详解Paint的setColorFilter(ColorFilter filter)
一.简介 setColorFilter(ColorFilter filter) 设置颜色过滤,这个方法需要我们传入一个ColorFilter参数同样也会返回一个ColorFilter实例.我们在set ...
- Drawable简介
Drawable简介 图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,这样就会增加学习和使用的成本,因此系统提供了一个被称之为Drawable的类来进行 ...
- Android Framework 简介
Android Framework 简介 简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有详记,结果被很多公司技术人员鄙视了,为了减少自己的短板,重新复习了一遍C++.java.Androi ...
- etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理
1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...
- Docker学习(一)-----Docker简介与安装
一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...
- 【Spring】框架简介
[Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...
- TensorRT简介
TensorRT 介绍 引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference) ...
- 谷粒商城学习笔记——第一期:项目简介
一.项目简介 1. 项目背景 市面上有5种常见的电商模式 B2B.B2C.C2B.C2C.O2O B2B 模式(Business to Business),是指商家和商家建立的商业关系.如阿里巴巴 B ...
- 通俗易懂的Go协程的引入及GMP模型简介
本文根据Golang深入理解GPM模型加之自己的理解整理而来 Go协程的引入及GMP模型 一.协程的由来 1. 单进程操作系统 2. 多线程/多进程操作系统 3. 引入协程 二.golang对协程的处 ...
最新文章
- 【Python】蒙特卡罗方法计算圆周率及给定随机数种子
- 实验吧逆向catalyst-system——WP
- 一步步通过命令行cl.exe编译Windows程序
- Excel 2016新增函数之IFS
- 直观判断每个整数是不是丑数的方法
- 查看Linux下端口占用情况的命令
- 是时候该了解一波Protocol Buffers了[Java]
- cocos2dx 3.x 开发环境搭建
- Java遍历Map集合的四种方式
- 国际期刊出版趋势及科技论文写作要点
- 开源项目——小Q聊天机器人V1.4
- 技术是把双刃剑,需要好好保管
- Design patterns 设计模式
- 【简历制作合集】面试时到底是用彩打简历还是黑白简历更出彩呢?|智测优聘出品
- equals()的理解
- 北京市地面数字电视节目表
- 电信运营商知多少(美国篇)
- 使用 C# 修改文件创建时间(图片也可修改)
- 【netcore】操作日志
- 二叉树广度优先搜索、深度优先搜索(前序、中序、后序)遍历,动图详解-Java/Kotlin双版本代码