文章目录

  • 一、LightingColorFilter滤镜(颜色+颜色创建的滤镜效果)
  • 二、PorterDuffColorFilter滤镜(颜色+图片)
  • 三、ColorMatrixColorFilter滤镜(颜色数组、颜色矩阵)
  • 四、常见滤镜效果
  • 五、ColorMatrix类
    • 5.1 setScale方法
    • 5.2 setSaturation方法
    • 5.3 setRotate方法

一、LightingColorFilter滤镜(颜色+颜色创建的滤镜效果)

构造:

 public LightingColorFilter(int mul, int add)

参数:

mul和add都是和颜色值格式相同的int值,mul是和目标像素相乘,add是和目标像素相加:
其中,若传入0x00ffff,对R而言,colorMultiply.R表示的就是:00;colorAdd.R表示:00

  • R’ = R * colorMultiply.R + colorAdd.R
  • G’ = G * colorMultiply.G + colorAdd.G
  • B’ = B * colorMultiply.B + colorAdd.B

使用:

LightingColorFilter lightingColorFilter = new LightingColorFilter(0x00ffff, 0x000000);
mPaint.setColorFilter(lightingColorFilter);
canvas.drawBitmap(mBitmap,0,0,mPaint);

效果:

如果想保留图片的原始效果,只需将mul改成0xffffff即可:

//保留原始效果
LightingColorFilter lightingColorFilter = new LightingColorFilter(0xffffff, 0x000000);
mPaint.setColorFilter(lightingColorFilter);
canvas.drawBitmap(mBitmap,0,0,mPaint);

效果:

想要绿色更亮:

//增大add的值,让绿色更亮
LightingColorFilter lightingColorFilter = new LightingColorFilter(0xffffff, 0x003000);
mPaint.setColorFilter(lightingColorFilter);
canvas.drawBitmap(mBitmap,0,0,mPaint);

二、PorterDuffColorFilter滤镜(颜色+图片)

构造方法:

public PorterDuffColorFilter(@ColorInt int color, @NonNull PorterDuff.Mode mode)

参数:

color:具体的颜色值,例如Color.RED
mode:指定PorterDuff.mode混合模式

使用:

//PorterDuffColorFilter
PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.DARKEN);
mPaint.setColorFilter(porterDuffColorFilter);
canvas.drawBitmap(mBitmap,100,0,mPaint);

运行效果:

不仅变红,而且变暗了。传入的是Color.RED,创建新的图层,图层颜色为红色。而原图片就可以看做为第二个图层。两个图层叠合在一起,就有了这个效果。PorterDuff.Mode.DARKEN模式表示在之前红色图片上,进一步将其调为暗色。这里是颜色和图片产生的滤镜效果

三、ColorMatrixColorFilter滤镜(颜色数组、颜色矩阵)

构造方法:

//传入数组,长度20。 第5列表示颜色的偏移量
public ColorMatrixColorFilter(float[] array)

参数:

array:矩阵数组

使用:

//ColorMatrixColorFilter
float[] colorMatrix={1,0,0,0,0, //red0,1,0,0,0, //green0,0,1,0,0, //blue0,0,0,1,0 //alpha 新颜色值的透明度
};
ColorMatrixColorFilter colorMatrixColorFilter = new ColorMatrixColorFilter(colorMatrix);
mPaint.setColorFilter(colorMatrixColorFilter);
canvas.drawBitmap(mBitmap,100,0,mPaint);

运行效果:

原图像效果。究其原因,我们要了解一下颜色矩阵-色彩矩阵分析。

下面我们将颜色矩阵的值做修改再运行,红色和绿色的偏移量,得到黄色的效果。:

float[] colorMatrix={1,0,0,0,100, //red0,1,0,0,100, //green0,0,1,0,0, //blue0,0,0,1,0 //alpha 新颜色值的透明度
};


通过修改RGB中系数a的值,红色更亮:

float[] colorMatrix={2,0,0,0,0, //red0,1,0,0,0, //green0,0,1,0,0, //blue0,0,0,1,0 //alpha 新颜色值的透明度
};


修改一张图片的彩色效果,有2种方式:

  • ①修改偏移量
  • ②RGBA的系数值

四、常见滤镜效果

 // 黑白public static final float colormatrix_heibai[] = {0.8f, 1.6f, 0.2f, 0, -163.9f,0.8f, 1.6f, 0.2f, 0, -163.9f,0.8f, 1.6f, 0.2f, 0, -163.9f,0, 0, 0, 1.0f, 0};// 怀旧public static final float colormatrix_huajiu[] = {0.2f, 0.5f, 0.1f, 0, 40.8f,0.2f, 0.5f, 0.1f, 0, 40.8f,0.2f, 0.5f, 0.1f, 0, 40.8f,0, 0, 0, 1, 0};// 哥特public static final float colormatrix_gete[] = {1.9f, -0.3f, -0.2f, 0, -87.0f,-0.2f, 1.7f, -0.1f, 0, -87.0f,-0.1f, -0.6f, 2.0f, 0, -87.0f,0, 0, 0, 1.0f, 0};// 淡雅public static final float colormatrix_danya[] = {0.6f, 0.3f, 0.1f, 0, 73.3f,0.2f, 0.7f, 0.1f, 0, 73.3f,0.2f, 0.3f, 0.4f, 0, 73.3f,0, 0, 0, 1.0f, 0};// 蓝调public static final float colormatrix_landiao[] = {2.1f, -1.4f, 0.6f, 0.0f, -71.0f,-0.3f, 2.0f, -0.3f, 0.0f, -71.0f,-1.1f, -0.2f, 2.6f, 0.0f, -71.0f,0.0f, 0.0f, 0.0f, 1.0f, 0.0f};// 光晕public static final float colormatrix_guangyun[] = {0.9f, 0, 0, 0, 64.9f,0, 0.9f, 0, 0, 64.9f,0, 0, 0.9f, 0, 64.9f,0, 0, 0, 1.0f, 0};// 梦幻public static final float colormatrix_menghuan[] = {0.8f, 0.3f, 0.1f, 0.0f, 46.5f,0.1f, 0.9f, 0.0f, 0.0f, 46.5f,0.1f, 0.3f, 0.7f, 0.0f, 46.5f,0.0f, 0.0f, 0.0f, 1.0f, 0.0f};// 酒红public static final float colormatrix_jiuhong[] = {1.2f, 0.0f, 0.0f, 0.0f, 0.0f,0.0f, 0.9f, 0.0f, 0.0f, 0.0f,0.0f, 0.0f, 0.8f, 0.0f, 0.0f,0, 0, 0, 1.0f, 0};// 胶片public static final float colormatrix_fanse[] = {-1.0f, 0.0f, 0.0f, 0.0f, 255.0f,0.0f, -1.0f, 0.0f, 0.0f, 255.0f,0.0f, 0.0f, -1.0f, 0.0f, 255.0f,0.0f, 0.0f, 0.0f, 1.0f, 0.0f};// 湖光掠影public static final float colormatrix_huguang[] = {0.8f, 0.0f, 0.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f, 0.0f, 0.0f,0.0f, 0.0f, 0.9f, 0.0f, 0.0f,0, 0, 0, 1.0f, 0};// 褐片public static final float colormatrix_hepian[] = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f,0.0f, 0.8f, 0.0f, 0.0f, 0.0f,0.0f, 0.0f, 0.8f, 0.0f, 0.0f,0, 0, 0, 1.0f, 0};// 复古public static final float colormatrix_fugu[] = {0.9f, 0.0f, 0.0f, 0.0f, 0.0f,0.0f, 0.8f, 0.0f, 0.0f, 0.0f,0.0f, 0.0f, 0.5f, 0.0f, 0.0f,0, 0, 0, 1.0f, 0};// 泛黄public static final 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};// 传统public static final float colormatrix_chuan_tong[] = {1.0f, 0.0f, 0.0f, 0, -10f,0.0f, 1.0f, 0.0f, 0, -10f,0.0f, 0.0f, 1.0f, 0, -10f,0, 0, 0, 1, 0};// 胶片2public static final float colormatrix_jiao_pian[] = {0.71f, 0.2f, 0.0f, 0.0f, 60.0f,0.0f, 0.94f, 0.0f, 0.0f, 60.0f,0.0f, 0.0f, 0.62f, 0.0f, 60.0f,0, 0, 0, 1.0f, 0};// 锐色public static final float colormatrix_ruise[] = {4.8f, -1.0f, -0.1f, 0, -388.4f,-0.5f, 4.4f, -0.1f, 0, -388.4f,-0.5f, -1.0f, 5.2f, 0, -388.4f,0, 0, 0, 1.0f, 0};// 清宁public static final float colormatrix_qingning[] = {0.9f, 0, 0, 0, 0,0, 1.1f, 0, 0, 0,0, 0, 0.9f, 0, 0,0, 0, 0, 1.0f, 0};// 浪漫public static final float colormatrix_langman[] = {0.9f, 0, 0, 0, 63.0f,0, 0.9f, 0, 0, 63.0f,0, 0, 0.9f, 0, 63.0f,0, 0, 0, 1.0f, 0};// 夜色public static final float colormatrix_yese[] = {1.0f, 0.0f, 0.0f, 0.0f, -66.6f,0.0f, 1.1f, 0.0f, 0.0f, -66.6f,0.0f, 0.0f, 1.0f, 0.0f, -66.6f,0.0f, 0.0f, 0.0f, 1.0f, 0.0f};

以其中的胶片效果为例,它就是将颜色数组中RGB中的系数取反,将颜色值反转,再加偏移量。

五、ColorMatrix类

5.1 setScale方法

ColorMatrix colorMatrix = new ColorMatrix();
//亮度调节
colorMatrix.setScale(1,1,1,1);//红、绿、蓝、透明度4个分量通道对应的系数
ColorMatrixColorFilter colorMatrixColorFilter = new ColorMatrixColorFilter(colorMatrix);
mPaint.setColorFilter(colorMatrixColorFilter);
canvas.drawBitmap(mBitmap,100,0,mPaint);

setScala方法全传1和原图一样,传1,2,1,1是偏绿色。他可以供我们调整图片的亮度。点进去看源码:

//setScala方法就是操作初始的颜色矩阵,将r/g/b/a四个系数重新赋值。
public void setScale(float rScale, float gScale, float bScale,float aScale) {final float[] a = mArray;for (int i = 19; i > 0; --i) {a[i] = 0;}a[0] = rScale;a[6] = gScale;a[12] = bScale;a[18] = aScale;
}

5.2 setSaturation方法

setScala方法就是操作初始的颜色矩阵,将r/g/b/a四个系数重新赋值。

ColorMatrix colorMatrix = new ColorMatrix();
//饱和度调节:0:无色彩 1:默认图像 >1:饱和度加强
colorMatrix.setSaturation(0);
ColorMatrixColorFilter colorMatrixColorFilter = new ColorMatrixColorFilter(colorMatrix);
mPaint.setColorFilter(colorMatrixColorFilter);
canvas.drawBitmap(mBitmap,100,0,mPaint);

5.3 setRotate方法

setRotate方法负责色度调节,也就是对色彩的旋转运算。,参数为:颜色通道axis、角度degrees。源码注释:

/*** Set the rotation on a color axis by the specified values.* <p>* <code>axis=0</code> correspond to a rotation around the RED color* <code>axis=1</code> correspond to a rotation around the GREEN color* <code>axis=2</code> correspond to a rotation around the BLUE color* </p>*/public void setRotate(int axis, float degrees) {reset();double radians = degrees * Math.PI / 180d;float cosine = (float) Math.cos(radians);float sine = (float) Math.sin(radians);switch (axis) {// Rotation around the red colorcase 0:mArray[6] = mArray[12] = cosine;mArray[7] = sine;mArray[11] = -sine;break;// Rotation around the green colorcase 1:mArray[0] = mArray[12] = cosine;mArray[2] = -sine;mArray[10] = sine;break;// Rotation around the blue colorcase 2:mArray[0] = mArray[6] = cosine;mArray[1] = sine;mArray[5] = -sine;break;default:throw new RuntimeException();}
}

传入的axis分别为为0、1、2表示红、绿、蓝三个颜色的通道,内部实际上还是操作的矩阵数组。只是算法的不同。首先要对角度值进行sin、cos值的运算,然后进行赋值操作。第二个参数就是要修改的值。具体如下:

ColorMatrix hueMatrix = new ColorMatrix();
hueMatrix.setRotate(0,hue0);
hueMatrix.setRotate(1,hue1);
hueMatrix.setRotate(2,hue2);

至于RGB色如何旋转,首先要根据R、G、B三色来建立三维坐标系,如下:

这里我们假设先暂不考虑蓝色,将绿、红看成二位坐标系,hueMatrix.setRotate(0,hue0);就是对红色的坐标进行旋转,旋转的角度为hue0的值。旋转计算前后的变化:

旋转后的红色的值需要计算R的cos值+G的sin值,绿色也会对其产生影响,故要加上。也就是两个垂直方向的值相加;旋转后绿色的值=G的cos值-R的sin值,也就是水平方向的值相加;当然了,蓝色的计算也是同样的道理

下面我们来试一下修改红色的旋转值:

     ColorMatrix colorMatrix = new ColorMatrix();colorMatrix.setRotate(0,45);ColorMatrixColorFilter colorMatrixColorFilter = new ColorMatrixColorFilter(colorMatrix);mPaint.setColorFilter(colorMatrixColorFilter);canvas.drawBitmap(mBitmap,100,0,mPaint);

Paint滤镜效果实现相关推荐

  1. Paint滤镜效果 实现各种阴影效果,包括不规则图形

    paint的滤镜效果,即对图像进行一定的过滤处理,可以实现如模糊阴影效果,浮雕效果,高亮图片,黑白照片,复古照片等效果. Android的绘图颜色值是32位的int值,即ARGB :A-Alpha值, ...

  2. Paint 滤镜效果

    LightingColorFliter /**          * R' = R * mul.R / 0xff + add.R          * G' = G * mul.G / 0xff + ...

  3. Android Paint 进阶之滤镜效果(ColorFilter)

    上一节整理了图层混合模式(Xfermode),这一节主要整理滤镜(ColorFilter)的使用. 分类 滤镜ColorFilter有三个子类,分别是LightingColorFilter.Porte ...

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

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

  5. Android Paint 画笔使用详解 Android自定义View(六)

    绘制在View.draw()方法里调用的,具体的执行顺序是: drawBackground():绘制背景,不能重写. onDraw():绘制主体. dispatchDraw():绘制子View onD ...

  6. android高级UI之Paint Xfermode

    在上一次https://www.cnblogs.com/webor2006/p/12660322.html学习了Paint的第二高级用法之滤镜效果,接下来这次将它的最后一个高级用法给搞定----Xfe ...

  7. android中的滤镜,android 实现滤镜效果

    最近在看关于自定义控件的东西,顺便看到了关于滤镜的东西,就写出来分享一下 这个有三个已知子类,写一个滤镜效果,只需要第一个已知子类就够用了,这个类构造方法public ColorMatrixColor ...

  8. hua图软件 mac_绘图大师Pro Paint for Mac-绘图大师Pro Paint Mac版下载 V3.5.1-PC6苹果网...

    绘图大师Pro Paint Mac版是Mac平台上的一款专业的绘图和图像处理软件.绘图大师Pro Paint Mac版为用户提供大量的高品质图像处理工具从而更好的创造原创艺术作品. 软件特色 绘图大师 ...

  9. Android:视图绘制(六) ------Paint进阶之ColorMatrix(一)

    本文主要讲ColorMatrix(色彩矩阵),Android中的图像颜色变换(色值,色相,饱和度,亮度,滤镜等一系列效果)均可用其实现. 写本文的时候距离这系列文章的上一篇已经有一段时间了,最近公司我 ...

最新文章

  1. 52 介绍几个重要的类
  2. Makefile_07:Make 的工作方式
  3. 3.5 Bounding Box 预测-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. 乌镇现场·帅初:公有链的未来——链上校验,链下计算
  5. Java对象的序列化与反序列化
  6. 扩展Windows Mobile模拟器存储空间的方法
  7. sqlite3的backup和restore函数的使用
  8. vue2实践揭秘pdf_《Vue2实践揭秘》源码
  9. 个人pkm软件 pim软件_个人申请软件著作权需要走哪些流程
  10. Apache Dubbo 3.0.0 正式发布!全面拥抱云原生
  11. 支持多协议多服务的服务器设计和实现的步骤,基于多协议的人工影响天气接入服务器设计与实现...
  12. 有人利用两个SaltStack 漏洞攻击思科 VIRL-PE 基础设施
  13. Android网络收集和ping封装库
  14. SSRF利用 Gopher |Gopher攻击mysql及内网
  15. FTP、TFTP 实现 NAT ALG 访问
  16. 【Java笔记】(十):swing图形界面
  17. 现在怎么不生产5寸大小的手机了?
  18. 你知道我国一共赠送了多少只熊猫给外国吗?来看看这个数据可视化项目
  19. 常用计算机 启动bios,详解各种电脑开机怎么进入bios设置
  20. 【龙印】用龙芯1c实现3D打印机的总体思路

热门文章

  1. Linux发布环境,linux发布环境初始化脚本
  2. Marketing learning-2
  3. day 01 ————立志运维的第一天开始,承若书!
  4. [python] 溜了,溜了,七牛云图片资源批量下载 自建图床服务器
  5. C9---include,编译
  6. 一个由进程内存布局异常引起的问题
  7. Linux 搭建SVN 服务器
  8. Windows 8.1之系统镜像备份功能(1)
  9. Linux性能分析和调整的基本原则
  10. python之地基(三)