文章目录

  • 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=R
0x88/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 简介相关推荐

  1. 详解Paint的setColorFilter(ColorFilter filter)

    一.简介 setColorFilter(ColorFilter filter) 设置颜色过滤,这个方法需要我们传入一个ColorFilter参数同样也会返回一个ColorFilter实例.我们在set ...

  2. Drawable简介

    Drawable简介 图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,这样就会增加学习和使用的成本,因此系统提供了一个被称之为Drawable的类来进行 ...

  3. Android Framework 简介

    Android Framework 简介 简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有详记,结果被很多公司技术人员鄙视了,为了减少自己的短板,重新复习了一遍C++.java.Androi ...

  4. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  5. Docker学习(一)-----Docker简介与安装

    一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...

  6. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  7. TensorRT简介

    TensorRT 介绍 引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference) ...

  8. 谷粒商城学习笔记——第一期:项目简介

    一.项目简介 1. 项目背景 市面上有5种常见的电商模式 B2B.B2C.C2B.C2C.O2O B2B 模式(Business to Business),是指商家和商家建立的商业关系.如阿里巴巴 B ...

  9. 通俗易懂的Go协程的引入及GMP模型简介

    本文根据Golang深入理解GPM模型加之自己的理解整理而来 Go协程的引入及GMP模型 一.协程的由来 1. 单进程操作系统 2. 多线程/多进程操作系统 3. 引入协程 二.golang对协程的处 ...

最新文章

  1. 【Python】蒙特卡罗方法计算圆周率及给定随机数种子
  2. 实验吧逆向catalyst-system——WP
  3. 一步步通过命令行cl.exe编译Windows程序
  4. Excel 2016新增函数之IFS
  5. 直观判断每个整数是不是丑数的方法
  6. 查看Linux下端口占用情况的命令
  7. 是时候该了解一波Protocol Buffers了[Java]
  8. cocos2dx 3.x 开发环境搭建
  9. Java遍历Map集合的四种方式
  10. 国际期刊出版趋势及科技论文写作要点
  11. 开源项目——小Q聊天机器人V1.4
  12. 技术是把双刃剑,需要好好保管
  13. Design patterns 设计模式
  14. 【简历制作合集】面试时到底是用彩打简历还是黑白简历更出彩呢?|智测优聘出品
  15. equals()的理解
  16. 北京市地面数字电视节目表
  17. 电信运营商知多少(美国篇)
  18. 使用 C# 修改文件创建时间(图片也可修改)
  19. 【netcore】操作日志
  20. 二叉树广度优先搜索、深度优先搜索(前序、中序、后序)遍历,动图详解-Java/Kotlin双版本代码

热门文章

  1. IntelliJ Idea 常用10款插件(提高开发效率)
  2. 如果控制文件损坏那么如何恢复?恢复控制文件的方式有哪几种
  3. ofstream的用法
  4. PrintWriter
  5. Mask RCNN详解
  6. 如何看待优秀的山东电视台
  7. [JavaScript][AJAX]onreadystatechange事件;AJAX含义及组成部分;AJAX工作原理/HTTP工作原理;一个页面从输入url到呈现网页过程;FormData对象;防抖
  8. echarts 折线图和柱状图叠加
  9. 大数据技术专业实习实训总结
  10. 愿世间项目再无node-sass