美文网首页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