美文网首页Android进阶之路Android技术知识Android开发
Paint高级用法:滤镜的3种实现方法

Paint高级用法:滤镜的3种实现方法

作者: space0o0 | 来源:发表于2019-10-09 10:35 被阅读0次

本文介绍Paint的高级用法:使用Paint对图片添加滤镜效果

  • LightingColorFilter
  • PorterDuffColorFilter
  • ColorMatrixColorFilter

LightingColorFilter

使用LightingColorFilter为图片添加滤镜效果,原理是修改图片的RGB色值

/**
* 计算原理
* R’ = R * colorMultiply.R + colorAdd.R
* G’ = G * colorMultiply.G + colorAdd.G
* B’ = B * colorMultiply.B + colorAdd.B
*/
public LightingColorFilter(@ColorInt int mul, @ColorInt int add) {
    mMul = mul;
    mAdd = add;
}

colorMultiply的RGB值乘以需要修改的RGB(原图颜色)+偏差的RGB(colorAdd)

例:

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

以计算新的R值为例。
colorMultiply的RGB中,R=00,
colorAdd的RGB中,每个色都为00。
R’ = R * 00 + 00 -> R'=00 代表了当前图片的红色被移除。

其余效果都可通过该公式进行调节。

PorterDuffColorFilter

通过图层的覆盖形式,为图片添加滤镜效果,本质上就是使用了Xfermode的方式。
何为图层覆盖,就是原始图片上面啪唧盖上一张图片,根据不同的覆盖模式,形成新的图片。

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

为原始图片添加一张红色的图层,根据PorterDuff.Mode的混合方式,为图片添加滤镜效果。

ColorMatrixColorFilter

使用颜色矩阵来为图片添加滤镜效果(涉及到矩阵的乘法原理)

//定义一个颜色矩阵
float[] colorMatrix = {
        2,0,0,0,0,   //red
        0,1,0,0,0,   //green
        0,0,1,0,0,   //blue
        0,0,0,1,0    //alpha
};
mColorMatrixColorFilter = new ColorMatrixColorFilter(colorMatrix);
mPaint.setColorFilter(mColorMatrixColorFilter);
canvas.drawBitmap(mBitmap, 100, 0, mPaint);

首先,我们的colorMatrix是一个4*5的矩阵

1.png

图像的RGBA是一个5*1的矩阵

2.png

通过矩阵相乘

3.png

得到最终的滤镜效果

colorMatrix的1~4行对应RGBA。

以第一行为例,abcd的修改,代表新的R值中RGBA的各个权重,e值和LightingColorFilter中的addColor原理一样,对R值的增加或减少。

我们也可以不用自己手写一个数组的颜色矩阵,系统自带ColorMatrix类帮助我们使用颜色矩阵

        ColorMatrix cm = new ColorMatrix();
//      亮度调节
//      cm.setScale(1,2,1,1);
//      饱和度调节0-无色彩, 1- 默认效果, >1饱和度加强
//      cm.setSaturation(2);
//      色调调节
        cm.setRotate(0, 45);
mColorMatrixColorFilter = new ColorMatrixColorFilter(cm);

注意:一般不太需要关注这类乘法原理,简单了解即可,网上有很多滤镜对于的colorMatrix。

列举部分颜色矩阵

// 黑白
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};
// 胶片2
public 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};

相关文章

网友评论

    本文标题:Paint高级用法:滤镜的3种实现方法

    本文链接:https://www.haomeiwen.com/subject/qnmwpctx.html