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

对图像进行一定的过滤加工处理,使用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);
} @Override
protected 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. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  2. 学习 opencv---(4) 分离颜色通道 && 多通道混合

    上篇文章中我们讲到了使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像混合操作. 而为了更好地观察一些图像材料的特征,有时需要对R ...

  3. firefox 扩展开发笔记(三):高级ui交互编程

    firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...

  4. 机器学习进阶-图片基本处理-ROI区域 1.img[0:200, 0:200]截取图片 2.cv2.split(对图片的颜色通道进行拆分) 3. cv2.merge(将颜色通道进行合并) 4 cur_img[:, :, 0] = 0 使得b通道的颜色数值为0

    1. 截取图片的部分区域img[0:200, 0:200], 读入的图片是ndarray格式 2. b, g, r = cv2.split(img)  # 对图片的颜色通道进行拆分 3.img = c ...

  5. 【Android UI】Android颜色系大全

    原文:http://android.eoe.cn/topic/summary 利用颜色的变化来突出信息.选择契合您应用主题的颜色系,并且提供视觉对比效果.注意,色弱的人士可能无法分辨红色和绿色. 调色 ...

  6. Vec3b类型数据确定颜色通道

    前言 这几天实习生测试一张图像的三个通道分别是什么颜色,使用的是Vec3b类型,然后发现了一个有意思的点.. 测试过程 先创建了一定大小的数据, Mat test( , , CV_8UC3, Scal ...

  7. opencv3.2.0 分离颜色通道&多通道图像混合

    ##名称:分离颜色通道&多通道图像混合 ##平台:QT5.7.1+OpenCV3.2.0 ##时间:2017年12月11日 /***************创建QT控制台程序********* ...

  8. Photoshop颜色通道实例

    PHOTOSHOP学到这会儿,我们不得不来学学枯燥乏味的颜色理论了,因为如果再不学,就难以学下去了.眼下我们就遇到了难点:颜色通道.前面在初识通道的时候,我已经说过:当你打开一张照片(RGB模式)的时 ...

  9. opencv 3 core组件进阶(2 ROI区域图像叠加&图像混合;分离颜色通道、多通道图像混合;图像对比度,亮度值调整)

    ROI区域图像叠加&图像混合 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp&g ...

随机推荐

  1. 树莓派 Linux 系统命令行快捷键

    刚入门树莓派时,在 Linux 下使用命令操作的时候,光标的移动令人头痛.命令输入完了,执行之后发现缺少权限,然后不得不移动光标到行首加 sudo,而命令又极长……当我学会了命令行相关的快捷键之后,不 ...

  2. 项目alpha冲刺-总结

    作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Alpha冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及可视化分析平台 这个作业的 ...

  3. [Dynamic Programming] 198. House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  4. React-Router常见API

    React-Router是React项目中处理路由的库. 1. HashRouter 通过hashchange监听路由的变化,通过window.location.hash赋值触发监听的变化. 本质是一 ...

  5. Java web开发——文件夹的上传和下载

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  6. 【洛谷P4093】 [HEOI2016/TJOI2016]序列 CDQ分治+动态规划

    你发现只会改变一个位置,所以可以直接进行dp 具体转移的话用 CDQ 分治转移就好了~ #include <bits/stdc++.h> #define N 100006 #define ...

  7. Python json数据写入csv json excel文件

    一.写入 写入csv和json, 可以使用csv这个包写, 我这里没有使用, 并且把写csv和json的写到一起了 具体的代码就不解释了 def write_file(file_name, items ...

  8. 【JZOJ6206】【20190610】二分图边染色

    题目 ​ 对一个二分图的边染色,满足有相同端点的边的颜色一定不同; ​ 设最优染色为\(C\) ,你的染色为\(X\),只需要满足$ X \le 2^ {\lceil log  C \rceil }$ ...

  9. 群晖采用root用户登录

    在控制面板中开启 ssh 登录 通过有 管理员权限的用户登录 通过输入 sudo -i 或者 sudo su - , 然后输入当前用户密码, 进入 root 输入如下命令可以修改root 用户的密码 ...

  10. Sybase数据库连接配置

    简介 1984年,Mark B. Hiffman和Robert Epstern创建了Sybase公司,并在1987年推出了Sybase数据库产品.SYBASE主要有三种版本,一是UNIX操作系统下运行 ...