利用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


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

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)

网友评论