滤镜在图片处理里面有很多的运用,尤其是相机使用了大量的滤镜,通过对颜色通道的调和,可以呈现出各种各样的效果

对图像进行一定的过滤加工处理,使用Paint设置滤镜效果
很多高级UI使用时候需要关闭硬件加速,不关闭的话,有些API无法支持

Alpha滤镜处理

MaskFilter处理类
paint.setMaskFilter(maskfilter)
以下两种处理基于下面的初始化

//关闭硬件加速
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);

模糊遮罩滤镜(BlurMaskFilter类)

构造函数原型

public BlurMaskFilter(float radius, Blur style)

使用例子

paint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.NORMAL));
RectF rectF = new RectF(100, 100, 200, 200);
canvas.drawRect(rectF, paint);
canvas.drawBitmap(bitmap, 400, 100, paint);

设置参数是,有四个参数:NORMAL,INNER,OUTER,SOLID
其参数效果如下

浮雕遮罩滤镜(EmbossMaskFilter类)

其构造函数原型为

public EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)

direction:指定长度为xxx的数组标量[x,y,z],用来指定光源的位置
ambient:指定周边背景光源(0~1)
specular:指镜面反射系数
blurRadius:指定模糊半径
使用例子

float[] direction = {100, 100, 100};
paint.setMaskFilter(new EmbossMaskFilter(direction, 0.6F, 8, 20));
rectF = new RectF(100, 100, 300, 300);
canvas.drawRect(rectF, paint);
canvas.drawBitmap(bitmap, 500, 100, paint);

得到的效果如下图所示

颜色RGB的滤镜处理

ColorMatrix处理类
滤镜的所有处理效果都是通过颜色矩阵的变换实现的。
比如:美颜相机实现的特效(高光、复古、黑白)
关于RGB滤镜处理是基于矩阵变换的,那么色彩信息矩阵是怎么表示的呢
四阶表示

如果想将色彩(0,255,0,255)更改为半透明时,可以使用下面的的矩阵运算来表示

而在真正的运算时,采用的是五阶矩阵
考虑下面这个变换:
1、红色分量值更改为原来的2倍;
2、绿色分量增加100;
则使用4阶矩阵的乘法无法实现,所以,应该在四阶色彩变换矩阵上增加一个"哑元坐标",来实现所列的矩阵运算:

这个矩阵中,分量值用的是100
例如提取颜色,这里只显示绿色和透明度

public class RGBFliterView extends View {private RectF rectF;public RGBFliterView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//关闭硬件加速setLayerType(View.LAYER_TYPE_SOFTWARE, null);Paint paint = new Paint();paint.setColor(Color.argb(200,200,200,200));paint.setAntiAlias(true);Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);//过滤前rectF = new RectF(100, 100, 300, 300);canvas.drawRect(rectF, paint);canvas.drawBitmap(bitmap, 500, 100, paint);//这个矩阵代表要提出绿色和透明度ColorMatrix matrix = new ColorMatrix(new float[]{0, 0, 0, 0, 0,0, 1, 0, 0, 0,0, 0, 0, 0, 0,0, 0, 0, 1, 0});//设置颜色过滤器paint.setColorFilter(new ColorMatrixColorFilter(matrix));//过滤后rectF = new RectF(100, 600, 300, 800);canvas.drawRect(rectF, paint);canvas.drawBitmap(bitmap, 500, 600, paint);}
}

得到的效果图如下

常见的色彩处理有这样一些运用

  1. 色彩的平移运算(加法运算)
  2. 色彩的缩放运算(乘法运算)

颜色增强:
[1.2F000001.2F000001.2F0000010]\begin{bmatrix} 1.2F & 0 & 0 & 0 & 0 \\\\ 0 & 1.2F & 0 & 0 & 0 \\\\ 0 & 0 & 1.2F & 0 & 0 \\\\ 0 & 0 & 0 & 1 & 0 \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​1.2F000​01.2F00​001.2F0​0001​0000​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​

反相效果:
[−10002550−10025500−1025500010]\begin{bmatrix} -1 & 0 & 0 & 0 & 255 \\\\ 0 & -1 & 0 & 0 & 255 \\\\ 0 & 0 & -1 & 0 & 255 \\\\ 0 & 0 & 0 & 1 & 0 \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​−1000​0−100​00−10​0001​2552552550​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​

黑白效果(R+G+B=1):
去色原理:只要把RGB三通道的色彩信息设置成一样;即:R=G=B,那么图像就变成了灰色,并且,为了保证图像亮度不变,同一个通道中的R+G+B=1:如:0.213+0.715+0.072=1; RGB=0.213, 0.715, 0.072;三个数字是根据色彩光波频率及色彩心理学计算出来的
[0.213F0.715F0.072F000.213F0.715F0.072F000.213F0.715F0.072F0000010]\begin{bmatrix} 0.213F & 0.715F & 0.072F & 0 & 0 \\\\ 0.213F & 0.715F & 0.072F & 0 & 0 \\\\ 0.213F & 0.715F & 0.072F & 0 & 0 \\\\ 0 & 0 & 0 & 1 & 0 \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​0.213F0.213F0.213F0​0.715F0.715F0.715F0​0.072F0.072F0.072F0​0001​0000​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​

发色效果(比如红色和绿色交换,把第一行和第二行交换):
[01000100000010000010]\begin{bmatrix} 0 & 1 & 0 & 0 & 0 \\\\ 1 & 0 & 0 & 0 & 0 \\\\ 0 & 0 & 1 & 0 & 0 \\\\ 0 & 0 & 0 & 1 & 0 \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​0100​1000​0010​0001​0000​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​

复古风格:
[1/2F1/2F1/2F001/3F1/3F1/3F001/4F1/4F1/4F0000010]\begin{bmatrix} 1/2F & 1/2F & 1/2F & 0 & 0 \\\\ 1/3F & 1/3F & 1/3F & 0 & 0 \\\\ 1/4F & 1/4F & 1/4F & 0 & 0 \\\\ 0 & 0 & 0 & 1 & 0 \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​1/2F1/3F1/4F0​1/2F1/3F1/4F0​1/2F1/3F1/4F0​0001​0000​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​
以上是使用矩阵自己去变换,但在实际中还是有一些可用的API的
此时使用的话,按照如下方法使用

ColorMatrix matrix = new ColorMatrix();
matrix.set(src)

有可以直接使用的方法

  • 设置色彩的缩放函数
matrix.setScale(1.2F, 1.2F, 1.2F, 1);
  • 设置饱和度,饱和度设置(1,是原来不变;0灰色;>1增加饱和度)
matrix.setSaturation(value);`
  • 色彩旋转函数
//axis,代表绕哪一个轴旋转,0,1,2 (0红色轴,1绿色,2蓝色)
//degrees:旋转的度数
matrix.setRotate(axis, degrees);
  • ColorFilter使用的子类
    ColorMatrixColorFilter:色彩矩阵的颜色过滤器
    LightingColorFilter(mul, add):过滤颜色和增强色彩的方法(光照颜色过滤器)
    PorterDuffColorFilter(color, mode):图形混合滤镜,Mode模式与Xfermode一致

高级UI-滤镜和颜色通道相关推荐

  1. 游戏ui切图,颜色通道_什么是ui通道设计,为什么如此重要

    游戏ui切图,颜色通道 Our approach to interface design has changed dramatically since the rise of mobile devic ...

  2. 高级UI之Paint(滤镜,颜色通道,矩阵运算)

    前言 在之前的几次课当中我们已经详细了解到整个android程序,从启动再到绘制的整体流程,从这中间我们又牵扯出了Canvas绘制图形的画板和我们的Paint控制色彩样式的画笔,那么之前基础篇我们就不 ...

  3. Android 高级UI解密 (二) :Paint滤镜 与 颜色过滤(矩阵变换)

    若是曾经查看过系统UI的源码, 会发现其中使用了一些渲染效果,例如将图片加上黑白.怀旧的效果,生活中常用的逆天美颜相机,其中的原理就是使用了滤镜效果.颜色通道过滤.若还要深究其原理组成,便涉及到了高等 ...

  4. 【Android 应用开发】Paint 滤镜原理 之 颜色矩阵 ( 颜色模式 | 颜色通道 | 颜色矩阵 | 矩阵运算 | 矩阵乘法 | 矩阵加法 | 颜色矩阵深入解析 )

    文章目录 颜色模式 颜色通道 Android 中的颜色矩阵 矩阵乘法运算 滤镜中的矩阵乘法运算 矩阵加法运算 滤镜中的矩阵乘法运算 滤镜运算原理 ( 总结 ) 实际滤镜理论示例 颜色模式 颜色模式 : ...

  5. Android 高级UI解密 (三) :Canvas裁剪 与 二维、三维Camera几何变换(图层Layer原理)

    Android的绘图机制是核心内容之一,无论是什么样的功能最终都是以图像的形式呈现给用户.因此掌握Android的绘图技巧,有助于Android理解层次的提高,在面对产品经理提出的idea时也更有底气 ...

  6. Android 高级UI解密 (四) :花式玩转贝塞尔曲线(波浪、轨迹变换动画)

    讲解此UI系列必然少不了一个奇妙数学曲线-–贝塞尔曲线,它目前运用于App的范围是在太广了,最初的QQ气泡拖拽,到个人界面的波浪效果.Loading波浪效果,甚至于轨迹变化的动画都可以依赖贝塞尔曲线完 ...

  7. 图像视频滤镜算法---颜色滤镜

    承接上一篇滤镜初识,本文将介绍第一种滤镜:颜色滤镜. 颜色滤镜 颜色滤镜即调色滤镜,也是最常见的滤镜,任何通过调节图像像素值的亮度.对比度.饱和度.色相等等方法,得到的不同于原图像颜色的效果,都统称为 ...

  8. 不同数字对应的颜色C语言,图像视频滤镜算法---颜色滤镜

    承接上一篇滤镜初识,本文将介绍第一种滤镜:颜色滤镜. 颜色滤镜 颜色滤镜即调色滤镜,也是最常见的滤镜,任何通过调节图像像素值的亮度.对比度.饱和度.色相等等方法,得到的不同于原图像颜色的效果,都统称为 ...

  9. 《OpenCV3编程入门》学习笔记5 Core组件进阶(三)分离合并颜色通道

    第5章 Core组件进阶 5.3 分离&合并颜色通道 5.3.1 通道分离:split()函数 1.作用:将一个多通道数组分离成几个单通道数组,公式: 2.原型:(1)void split(c ...

  10. 【opencv】(1) 基础操作:图像视频读取、图像截取、颜色通道

    主要内容有:图像及视频的读取和保存.图像显示.转换灰度图.图像截取.颜色通道提取和组合 那我们开始吧. 1. 图像操作 首先我们导入opencv库,彩色图像一般都是由RGB(红绿蓝)三颜色通道构成,灰 ...

最新文章

  1. django-Modelform
  2. 《数据库原理与应用(第3版)》——1.4 数据库系统的组成
  3. calibre中的hcell_关于calibre的Hcell你知道多少?
  4. java的c import_关于编译(javac),import,package的再理解
  5. 下行物理信道rs_5G物理层服务模型
  6. 基于cxf框架javaweb服务说明
  7. 免费的中文OCR软件
  8. 一张书籍清单(软件工程师学习参考资料)
  9. VUE Error:if there's nested data,rowKey is required错误
  10. ID2021安装教程【科技猿说】
  11. 实时工业以太网EtherCAT高速发展背后
  12. 基于GO语言,查询信息类网站部署手册
  13. 【Adrealm智库专栏】激励机制——区块链的核心
  14. 实现一个指南针功能的微信小程序
  15. outlook搜索栏跑到上面去了_都市农园 周末去谈一场恋爱,顺便买回一座花园
  16. 安装ubuntu12.04之后的一些优化教程
  17. React 测试教程
  18. linux 进程与服务
  19. CPU是如何执行程序的?
  20. 小程序公众号干货运营之注销篇

热门文章

  1. MySQL全文索引的坑 20211202
  2. Ionic 创建打包项目
  3. 我的USB DAC改装(MOD)流程(上)
  4. 探索深海生态系统和冰卫星的协同作用-深海机器人开发与空间技术合作
  5. Gigabit Ethernet
  6. ini更改文件夹图标
  7. 自己制作一个计时器、倒计时器
  8. leetcode#248 中心对称数 III
  9. 电脑桌面显示不全设置方法
  10. Android activity主题设置为dialog 样式