本片文章讲解Xfermode混合模式和ColorFilter颜色过滤

注意本节代码先关闭硬件加速。

Xfermode

一、setXfermode(Xfermode xfermode)
Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是图像混合的一种,这个方法跟我们上面讲到的setColorFilter蛮相似的。查看API文档发现其果然有三个子类:AvoidXfermode, PixelXorXfermode和PorterDuffXfermode,这三个子类实现的功能要比setColorFilter的三个子类复杂得多。
二、AvoidXfermode
2.1 关闭硬件加速
这个API因为不支持硬件加速在API 16已经过时了(大家可以在HardwareAccel查看那些方法不支持硬件加速)如果想在高于API 16的机子上进行测试,必须现在应用或手机设置中关闭硬件加速,在应用中我们可以通过在AndroidManifest.xml文件中设置application节点下的android:hardwareAccelerated属性为false来关闭硬件加速,注意:如果你在设置中开启了强制硬件加速(强制使用GPU进行绘制),在代码中配置也是没用的。
三、PixelXorXfermode
与AvoidXfermode一样也在API 16过时了,该类也提供了一个含参的构造方法PixelXorXfermode(int opColor),该类的计算实现很简单,从官方给出的计算公式来看就是:op ^ src ^ dst,像素色值的按位异或运算,如果大家感兴趣,可以自己用一个纯色去尝试,并自己计算异或运算的值是否与得出的颜色值一样,这里我就不讲了,Because it was deprecated and useless。
四、PorterDuffXfermode
Xfermode的最后一个子类也是惟一一个没有过时且沿用至今的子类,这个类是否强大,值得我们好好的学习学习。该类同样有且只有一个含参的构造方法PorterDuffXfermode(PorterDuff.Mode mode),这个PorterDuff.Mode大家看后是否会有些面熟,它跟上面我们讲ColorFilter时候用到的PorterDuff.Mode是一样的!PorterDuffXfermode就是图形混合模式的意思。

 图像混合模式演示类:AvoidXfermode、PixelXorXfermode、PorterDuffXfermode【主讲这个类】PorterDuffXfermode:它将所绘制图形的像素与Canvas中对应位置的像素按照一定规则进行混合,形成新的像素值,从而更新Canvas最终的像素颜色值。一共18种模式。

//Xfermode用到的三种地方
        //mPaint.setXfermode(Xfermode xfermode)
        //new ComposeShader(@Shader shaderA,Shader shaderB,Xfermode mode)
        //PorterDuffColorFilter

为了更直观的解释Xfermode的效果,我们直接引用google给的示例,github地址:

https://github.com/THEONE10211024/ApiDemos

找到一个叫Xfermodes.java的类拷贝到我们项目当中,直接运行看效果,这里我们改一下名字为:GoogleXfermodes

GoogleXfermodes:

public class GoogleXfermodes extends View {private static final int W = 150;private static final int H = W;private static final int ROW_MAX = 4;   // number of samples per rowprivate Bitmap mSrcBRect;private Bitmap mDstBOval;private Shader mBG;     // background checker-board patternprivate Paint mPaint;//效果作用于src源图像区域private static final Xfermode[] sModes = {//所绘制不会提交到画布上new PorterDuffXfermode(PorterDuff.Mode.CLEAR),//显示上层绘制的图像new PorterDuffXfermode(PorterDuff.Mode.SRC),//显示下层绘制图像new PorterDuffXfermode(PorterDuff.Mode.DST),//正常绘制显示,上下层绘制叠盖new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),//上下层都显示,下层居上显示new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),//取两层绘制交集,显示上层new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),//取两层绘制交集,显示下层new PorterDuffXfermode(PorterDuff.Mode.DST_IN),//取上层绘制非交集部分,交集部分变成透明new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),//取下层绘制非交集部分,交集部分变成透明new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),//取上层交集部分与下层非交集部分new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),//取下层交集部分与上层非交集部分new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),//去除两图层交集部分new PorterDuffXfermode(PorterDuff.Mode.XOR),//取两图层全部区域,交集部分颜色加深new PorterDuffXfermode(PorterDuff.Mode.DARKEN),//取两图层全部区域,交集部分颜色点亮new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),//取两图层交集部分,颜色叠加new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),//取两图层全部区域,交集部分滤色new PorterDuffXfermode(PorterDuff.Mode.SCREEN),//取两图层全部区域,交集部分饱和度相加new PorterDuffXfermode(PorterDuff.Mode.ADD),//取两图层全部区域,交集部分叠加new PorterDuffXfermode(PorterDuff.Mode.OVERLAY)};private static final String[] sLabels = {"Clear", "Src", "Dst", "SrcOver","DstOver", "SrcIn", "DstIn", "SrcOut","DstOut", "SrcATop", "DstATop", "Xor","Darken", "Lighten", "Multiply", "Screen", "Add", "Overlay"};public GoogleXfermodes(Context context) {super(context);mSrcBRect = makeSrcRect(W, H);mDstBOval = makeDstOval(W, H);// make a ckeckerboard patternBitmap bm = Bitmap.createBitmap(new int[]{0xFFFFFFFF, 0xFFCCCCCC, 0xFFCCCCCC, 0xFFFFFFFF}, 2, 2, Bitmap.Config.RGB_565);mBG = new BitmapShader(bm, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);Matrix m = new Matrix();m.setScale(6, 6);mBG.setLocalMatrix(m);mPaint = new Paint();mPaint.setStrokeWidth(2);mPaint.setStyle(Paint.Style.STROKE);mPaint.setColor(Color.GRAY);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(Color.WHITE);Paint labelP = new Paint(Paint.ANTI_ALIAS_FLAG);labelP.setTextAlign(Paint.Align.CENTER);labelP.setTextSize(22);Paint paint = new Paint();paint.setFilterBitmap(false);canvas.translate(15, 15);canvas.drawBitmap(mDstBOval, 0, 0, paint);canvas.drawRect(0, 0, mDstBOval.getWidth(), mDstBOval.getHeight(), mPaint);canvas.drawBitmap(mSrcBRect, mDstBOval.getWidth() + 15, 0, paint);canvas.drawRect(mDstBOval.getWidth() + 15, 0, mDstBOval.getWidth() + 15 + mSrcBRect.getWidth(), mSrcBRect.getHeight(), mPaint);canvas.translate(0, mDstBOval.getHeight() + 15);int x = 0;int y = 0;for (int i = 0; i < sModes.length; i++) {// draw the borderpaint.setStyle(Paint.Style.STROKE);paint.setShader(null);canvas.drawRect(x - 0.5f, y - 0.5f,x + W + 0.5f, y + H + 0.5f, paint);// draw the checker-board patternpaint.setStyle(Paint.Style.FILL);paint.setShader(mBG);canvas.drawRect(x, y, x + W, y + H, paint);// draw the src/dst example into our offscreen bitmapint sc = canvas.saveLayer(x, y, x + W, y + H, null, Canvas.ALL_SAVE_FLAG);canvas.translate(x, y);//目标图像canvas.drawBitmap(mDstBOval, 0, 0, paint);paint.setXfermode(sModes[i]);//源图像canvas.drawBitmap(mSrcBRect, 0, 0, paint);paint.setXfermode(null);canvas.restoreToCount(sc);// draw the labelcanvas.drawText(sLabels[i], x + W / 2, y - labelP.getTextSize() / 2, labelP);x += W + 10;// wrap around when we've drawn enough for one rowif ((i % ROW_MAX) == ROW_MAX - 1) {x = 0;y += H + 30;}}}/*** dst : 画圆形*/Bitmap makeDstOval(int w, int h) {Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);Canvas c = new Canvas(bm);Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);p.setColor(0xFFFFCC44);c.drawOval(new RectF(0, 0, w * 3 / 4, h * 3 / 4), p);return bm;}/*** dst : 画正方形*/Bitmap makeSrcRect(int w, int h) {Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);Canvas c = new Canvas(bm);Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);p.setColor(0xFF66AAFF);c.drawRect(w / 3, h / 3, w * 19 / 20, h * 19 / 20, p);return bm;}
}

运行效果:

每种模式的中文解释:

//所绘制不会提交到画布上
new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
//显示上层绘制的图像
new PorterDuffXfermode(PorterDuff.Mode.SRC),
//显示下层绘制图像
new PorterDuffXfermode(PorterDuff.Mode.DST),
//正常绘制显示,上下层绘制叠盖
new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),//上下层都显示,下层居上显示
new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
//取两层绘制交集,显示上层
new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
//取两层绘制交集,显示下层
new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
//取上层绘制非交集部分,交集部分变成透明
new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),//取下层绘制非交集部分,交集部分变成透明
new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
//取上层交集部分与下层非交集部分
new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
//取下层交集部分与上层非交集部分
new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
//去除两图层交集部分
new PorterDuffXfermode(PorterDuff.Mode.XOR),//取两图层全部区域,交集部分颜色加深
new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
//取两图层全部区域,交集部分颜色点亮
new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
//取两图层交集部分,颜色叠加
new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
//取两图层全部区域,交集部分滤色
new PorterDuffXfermode(PorterDuff.Mode.SCREEN),//取两图层全部区域,交集部分饱和度相加
new PorterDuffXfermode(PorterDuff.Mode.ADD),
//取两图层全部区域,交集部分叠加
new PorterDuffXfermode(PorterDuff.Mode.OVERLAY)

注意点是:离屏绘制

PorterDuffXfermode的用处可以作为刮奖案例:

贴出来代码:

XfermodeEraserView:

public class XfermodeEraserView extends View {private Paint  mPaint;private Bitmap mDstBmp, mSrcBmp, mTxtBmp;private Path mPath;public XfermodeEraserView(Context context) {this(context, null);}public XfermodeEraserView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public XfermodeEraserView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {//初始化画笔mPaint = new Paint();mPaint.setColor(Color.RED);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(80);//禁用硬件加速setLayerType(View.LAYER_TYPE_SOFTWARE, null);//初始化图片对象mTxtBmp = BitmapFactory.decodeResource(getResources(), R.drawable.result);mSrcBmp = BitmapFactory.decodeResource(getResources(), R.drawable.eraser);mDstBmp = Bitmap.createBitmap(mSrcBmp.getWidth(), mSrcBmp.getHeight(), Bitmap.Config.ARGB_8888);//路径(贝塞尔曲线)mPath = new Path();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//绘制刮奖结果canvas.drawBitmap(mTxtBmp, 0, 0, mPaint);//使用离屏绘制int layerID = canvas.saveLayer(0, 0, getWidth(), getHeight(), mPaint, Canvas.ALL_SAVE_FLAG);//先将路径绘制到 bitmap上Canvas dstCanvas = new Canvas(mDstBmp);dstCanvas.drawPath(mPath, mPaint);//绘制 目标图像canvas.drawBitmap(mDstBmp, 0, 0, mPaint);//设置 模式 为 SRC_OUT, 擦橡皮区域为交集区域需要清掉像素mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));//绘制源图像canvas.drawBitmap(mSrcBmp, 0, 0, mPaint);mPaint.setXfermode(null);canvas.restoreToCount(layerID);}private float mEventX, mEventY;@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mEventX = event.getX();mEventY = event.getY();mPath.moveTo(mEventX, mEventY);break;case MotionEvent.ACTION_MOVE:float endX = (event.getX() - mEventX) / 2 + mEventX;float endY = (event.getY() - mEventY) / 2 + mEventY;//画二阶贝塞尔曲线mPath.quadTo(mEventX, mEventY, endX, endY);mEventX = event.getX();mEventY = event.getY();break;}invalidate();return true; //消费事件}}

ColorFilter

接下来讲新的内容:滤镜效果
setColorFilter(ColorFilter filter)
设置颜色过滤,这个方法需要我们传入一个ColorFilter参数同样也会返回一个ColorFilter实例。我们在setColorFilter(ColorFilter filter)的时候可以直接传入ColorMatrixColorFilter、LightingColorFilter或PorterDuffColorFilter的子类对象作为参数。这些类其实都是colorFilter的子类,下面我们来一个个分析下它们的作用。

代码:

ColorFilterDemo:

public class ColorFilterDemo extends View {private Bitmap mBitmap;private Paint mPaint;public ColorFilterDemo(Context context) {this(context, null);}public ColorFilterDemo(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public ColorFilterDemo(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cat);mPaint = new Paint();//初始化mPaint.setColor(Color.RED);//设置颜色mPaint.setAntiAlias(true);mPaint.setStyle(Paint.Style.FILL);}@Overrideprotected void onDraw(Canvas canvas) {//LightingColorFilter滤镜//lightingColorFilter(canvas);//PorterDuffColorFilter滤镜//porterDuffColorFilter(canvas);//ColorMatrixColorFilter滤镜colorMatrixColorFilter(canvas);}private void colorMatrixColorFilter(Canvas canvas) {float[] colorMatrix = {1, 0, 0, 0, 0,//r0, 1, 0, 0, 0,//g0, 0, 1, 0, 0,//b0, 0, 0, 1, 0//a};float[] colorMatrix2 = {1, 0, 0, 0, 100,//r0, 1, 0, 0, 0,//g0, 0, 1, 0, 100,//b0, 0, 0, 1, 0//a};ColorMatrixColorFilter colorMatrixColorFilter = new ColorMatrixColorFilter(ColorFilter.colormatrix_jiuhong);//绘制原图canvas.drawBitmap(mBitmap, 0, 0, mPaint);//设置滤镜mPaint.setColorFilter(colorMatrixColorFilter);//绘制滤镜之后的图canvas.drawBitmap(mBitmap, 0, 300, mPaint);}private void porterDuffColorFilter(Canvas canvas) {PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.DARKEN);//绘制原图canvas.drawBitmap(mBitmap, 0, 0, mPaint);//设置滤镜mPaint.setColorFilter(porterDuffColorFilter);//绘制滤镜之后的图canvas.drawBitmap(mBitmap, 0, 300, mPaint);}/*** R' = R * colorMultiply.R + colorAdd.R* G' = G * colorMultiply.G + colorAdd.G* B' = B * colorMultiply.B + colorAdd.B*/private void lightingColorFilter(Canvas canvas) {//将原图片的的红色给剔除掉LightingColorFilter lightingColorFilter = new LightingColorFilter(0x00fffff, 0x000000);//让绿色更绿LightingColorFilter lightingColorFilter2 = new LightingColorFilter(0xfffffff, 0x002900);//绘制原图canvas.drawBitmap(mBitmap, 0, 0, mPaint);//设置滤镜mPaint.setColorFilter(lightingColorFilter2);//绘制滤镜之后的图canvas.drawBitmap(mBitmap, 0, 300, mPaint);}
}

LightingColorFilter效果:

    /*** R' = R * colorMultiply.R + colorAdd.R* G' = G * colorMultiply.G + colorAdd.G* B' = B * colorMultiply.B + colorAdd.B*/private void lightingColorFilter(Canvas canvas) {//将原图片的的红色给剔除掉LightingColorFilter lightingColorFilter = new LightingColorFilter(0x00fffff, 0x000000);//让绿色更绿LightingColorFilter lightingColorFilter2 = new LightingColorFilter(0xfffffff, 0x002900);//绘制原图canvas.drawBitmap(mBitmap, 0, 0, mPaint);//设置滤镜mPaint.setColorFilter(lightingColorFilter2);//绘制滤镜之后的图canvas.drawBitmap(mBitmap, 0, 300, mPaint);}

PorterDuffColorFilter效果:

    private void porterDuffColorFilter(Canvas canvas) {PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.DARKEN);//绘制原图canvas.drawBitmap(mBitmap, 0, 0, mPaint);//设置滤镜mPaint.setColorFilter(porterDuffColorFilter);//绘制滤镜之后的图canvas.drawBitmap(mBitmap, 0, 300, mPaint);}

ColorMatrixColorFilter效果:

    private void colorMatrixColorFilter(Canvas canvas) {//保持原图float[] colorMatrix = {1, 0, 0, 0, 0,//r0, 1, 0, 0, 0,//g0, 0, 1, 0, 0,//b0, 0, 0, 1, 0//a};//r+bfloat[] colorMatrix2 = {1, 0, 0, 0, 100,//r0, 1, 0, 0, 0,//g0, 0, 1, 0, 100,//b0, 0, 0, 1, 0//a};ColorMatrixColorFilter colorMatrixColorFilter = new ColorMatrixColorFilter(colorMatrix2);//绘制原图canvas.drawBitmap(mBitmap, 0, 0, mPaint);//设置滤镜mPaint.setColorFilter(colorMatrixColorFilter);//绘制滤镜之后的图canvas.drawBitmap(mBitmap, 0, 300, mPaint);}

最后附上常见的颜色滤镜工具类ColorFilter:

/*** 收集的颜色滤镜*/
public class ColorFilter {/*** 为imageView设置颜色滤镜** @param imageView* @param colormatrix*/public static void imageViewColorFilter(ImageView imageView, float[] colormatrix) {setColorMatrixColorFilter(imageView, new ColorMatrixColorFilter(new ColorMatrix(colormatrix)));}/*** 为imageView设置颜色偏向滤镜** @param imageView* @param color*/public static void imageViewColorFilter(ImageView imageView, int color) {ColorMatrix colorMatrix = new ColorMatrix();colorMatrix.setScale(Color.alpha(color), Color.red(color), Color.green(color), Color.blue(color));setColorMatrixColorFilter(imageView, new ColorMatrixColorFilter(colorMatrix));}/*** 生成对应颜色偏向滤镜的图片,并回收原图** @param bitmap* @param color* @return*/public static Bitmap bitmapColorFilter(Bitmap bitmap, int color) {ColorMatrix colorMatrix = new ColorMatrix();colorMatrix.setScale(Color.alpha(color), Color.red(color), Color.green(color), Color.blue(color));return setColorMatrixColorFilter(bitmap, new ColorMatrixColorFilter(colorMatrix), true);}/*** 生成对应颜色滤镜的图片,并回收原图** @param bitmap* @param colormatrix* @return*/public static Bitmap bitmapColorFilter(Bitmap bitmap, float[] colormatrix) {return setColorMatrix(bitmap, colormatrix, true);}/*** 生成对应颜色滤镜的图片** @param bitmap* @param colormatrix* @param isRecycle* @return*/public static Bitmap setColorMatrix(Bitmap bitmap, float[] colormatrix, boolean isRecycle) {return setColorMatrixColorFilter(bitmap, new ColorMatrixColorFilter(new ColorMatrix(colormatrix)), isRecycle);}public static void setColorMatrixColorFilter(ImageView imageView, ColorMatrixColorFilter matrixColorFilter) {imageView.setColorFilter(matrixColorFilter);}public static Bitmap setColorMatrixColorFilter(Bitmap bitmap, ColorMatrixColorFilter matrixColorFilter, boolean isRecycle) {Bitmap resource = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);Paint paint = new Paint();paint.setAntiAlias(true);paint.setColorFilter(matrixColorFilter);Canvas canvas = new Canvas(resource);canvas.drawBitmap(bitmap, 0, 0, paint);return resource;}// 黑白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};}

END

1.2.2Paint-混合模式Xfermode和颜色过滤ColorFilter相关推荐

  1. android图片颜色过滤,在Android上实现图像颜色过滤与反转

    在Android上实现图像颜色过滤与反转 一:原理 Android已经提供了以resource形式加载图片,使用BitmapFactory的decodeResource 方法获取一个Bitmap对象, ...

  2. 在Android上实现图像颜色过滤与反转

    在Android上实现图像颜色过滤与反转 一:原理 Android已经提供了以resource形式加载图片,使用BitmapFactory的decodeResource 方法获取一个Bitmap对象, ...

  3. Android 高级UI解密 (二) :Paint滤镜 与 颜色过滤(矩阵变换)

    若是曾经查看过系统UI的源码, 会发现其中使用了一些渲染效果,例如将图片加上黑白.怀旧的效果,生活中常用的逆天美颜相机,其中的原理就是使用了滤镜效果.颜色通道过滤.若还要深究其原理组成,便涉及到了高等 ...

  4. python填充红色_opencv之颜色过滤只留下图片中的红色区域操作

    如图,这次需要在图片中找到卷尺的红色刻度,所以需要对图像做过滤,只留下红色部分. 一开始的想法是分别找到RGB值,然后找到红色区域的部分保留就可以了,不过好像很难确定红色区域的RGB取值范围,所以要把 ...

  5. android屏幕颜色过滤调节(可用于护眼模式)

    实现思路 1.android 创建 透明 dailog 对dailog 进行 背景 颜色的改变 达到遮罩 下方内容的效果 2.颜色的 过滤调节 算法 就是对 分别对 rgb三原色 的增加与减少 3.改 ...

  6. C++ override解释

    C++ override从字面意思上,是覆盖的意思,实际上在C++中它是覆盖了一个方法并且对其重写,从而达到不同的作用.在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行 ...

  7. 利用GRB颜色模型过滤条件进行火灾检测

    火灾检测的相关介绍参考我另一篇博客:火灾检测方法总结       本文RGB过滤条件参考论文:Fire detection using statistical color model in video ...

  8. 自定义view2/12----Paint常用方法(主要是ColorMatrix,Xfermode)

    尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 上一节我们粗略地讲了下如何去实现我 ...

  9. 【Android 应用开发】Paint 滤镜原理 之 颜色矩阵 ( 颜色模式 | 颜色通道 | 颜色矩阵 | 矩阵运算 | 矩阵乘法 | 矩阵加法 | 颜色矩阵深入解析 )

    文章目录 颜色模式 颜色通道 Android 中的颜色矩阵 矩阵乘法运算 滤镜中的矩阵乘法运算 矩阵加法运算 滤镜中的矩阵乘法运算 滤镜运算原理 ( 总结 ) 实际滤镜理论示例 颜色模式 颜色模式 : ...

最新文章

  1. Python2+Selenium入门03-元素定位
  2. GPP加密破解工具gpp-decrypt
  3. bzoj 4747: [Usaco2016 Dec]Counting Haybales
  4. 最近和很多创业者和中小企业老板沟通
  5. 基于handsontable的web excel(上)
  6. 芯片PM该知道的IC术语(二)封装的一些细节
  7. 64位计算机安装xp,练习u盘如何安装XP 64位系统
  8. Springboot实现阿里云通信短信服务有关短信验证码的发送
  9. 计算机网络学习 - 网卡
  10. aspose合并单元格
  11. CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用
  12. [数学学习笔记]函数的连续性
  13. 让你的BT迅雷下载速度提升十倍以上....
  14. 区块链溯源系统开发:为何百度、阿里纷纷押注区块链溯源
  15. 【系统分析师之路】2014年系统分析师上午综合知识真题
  16. 新数据时代存储怎么卖,浪潮存储有高招!
  17. 论文翻译 Joint Discriminative and Generative Learning for Person Re-identification
  18. HCNA学习笔记(一)企业网络基本架构简述
  19. thinkpad卡在logo界面_win7系统开机卡在开机Thinkpad LOGO画面的解决方法
  20. 谈谈我用扫地机器人的心得

热门文章

  1. php7.4升级php8.0后重启系统网站访问异常问题
  2. [练习题] 2 . 有效数字
  3. 基于后投影算法穿墙雷达成像附matlab代码
  4. Markdown基本语法 学习笔记----表格序号31
  5. 拓维文档无法注册模块,请与技术人员联系
  6. 简历狗-程序员简历模板推荐 程序员求职简历如何写
  7. mac清理视频缓存在哪里找和mac清理视频缓存怎么清理
  8. 520,用AI为她写首歌吧!
  9. Ubuntu Desktop 隐藏 / 显示文件和文件夹
  10. [go]gg库绘图与添加文字