美文网首页
Paint实现滤镜效果

Paint实现滤镜效果

作者: Lucky胡 | 来源:发表于2019-11-06 19:22 被阅读0次

利用Paint绘制滤镜Xfermode

PorterDuff.Mode图层混合模式
一共有18种模式。

它将所绘制的图形的像素与Canvas中对应位置的像素按照一定规则混合,形成新的像素值,从而更新Canvas中最终的像素颜色值。

//有三个地方用到图层混合
//1、ComposeShader
//2、mPaint.setXfermode
//3、PorterDuffColorFilter
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        mShader = new ComposeShader(bitmapShader,linearGradient, new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
        mPaint.setShader(mShader);
//....
        //由于某些图层混合在硬件加速下不能用
        //所以需要禁止硬件加速
        setLayerType(View.LAYER_TYPE_SOFTWARE,null);



        //离屏绘制
        var layerId = canvas.saveLayer(
            0f,
            0f,
            width.toFloat(),
            height.toFloat(),
            mPaint,
            Canvas.ALL_SAVE_FLAG
        )

        //目标图
        canvas.drawBitmap(rectBitmap, 0f, 0f, mPaint)
        //设置混合模式
        mPaint!!.setXfermode(PorterDuffXfermode(PorterDuff.Mode.SRC_OUT))
        //源图,重叠区域右下角部分
        canvas.drawBitmap(circleBitmap, 0f, 0f, mPaint)
        //清除混合模式
        mPaint!!.setXfermode(null)

        canvas.restoreToCount(layerId)

LightingColorFilter滤镜

        /**
         * LightingColorFilter滤镜
         * LightingColorFilter(@ColorInt int mul, @ColorInt int add)
         * R' = R * mul.R / 0xff + add.R
         * G' = G * mul.G / 0xff + add.G
         * B' = B * mul.B / 0xff + add.B
         *
         * 实现效果:mul是相乘,比如0x00ffff,可以去除红色值
         * add是相加,可以提高某个色值,比如0x0000ff,可以提高蓝色值
         */
        filter = LightingColorFilter(0x00ffff,0x000000)
        paint.colorFilter = filter
LightingColorFilter(0x00ffff,0x000000),去除红色值 LightingColorFilter(0xffffff,0x0000ff),提高蓝色值

PorterDuffColorFilter滤镜

        /**
         * 让某种颜色跟图层进行混合,混合模式有很多种
         */
        filter = PorterDuffColorFilter(Color.RED,PorterDuff.Mode.DARKEN)
        paint.colorFilter = filter
PorterDuffColorFilter(Color.RED,PorterDuff.Mode.DARKEN)

ColorMatrixColorFilter 颜色矩阵滤镜

        var colorMatrix = floatArrayOf(
            1f,0f,0f,0f,100f,            //red
            0f,1f,0f,0f,0f,            //green
            0f,0f,1f,0f,0f,            //blue
            0f,0f,0f,1f,0f             //alpha
        )
        filter = ColorMatrixColorFilter(colorMatrix)
        paint.colorFilter = filter

通过修改颜色矩阵不同参数,可以获得各种效果,比如常见的梦幻滤镜、胶片滤镜、复古滤镜等。

常见的滤镜效果
       //胶片滤镜
        var colorMatrix = floatArrayOf(
            -1f,0f,0f,0f,255f,            //red
            0f,-1f,0f,0f,255f,            //green
            0f,0f,-1f,0f,255f,            //blue
            0f,0f,0f,1f,0f             //alpha
        )
胶片滤镜
        //也可以用ColorMatrix()获得颜色矩阵
        var cm = ColorMatrix()
        //亮度调节
        cm.setScale(1f,1f,1f,1f)
        //饱和度调整(0:无色彩,1-原图,>1饱和度加强)
        cm.setSaturation(0f)
        filter = ColorMatrixColorFilter(cm)
ColorMatrix()里饱和度为0

相关文章

网友评论

      本文标题:Paint实现滤镜效果

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