ColorMatrix的使用

来源:互联网 发布:气动快速接头 淘宝 编辑:程序博客网 时间:2024/06/16 06:14

一、概述

使用ColorMatrix绘制图片的简单代码如下:

        ColorMatrix colorMatrix1 = new ColorMatrix();        colorMatrix1.set(new float[]{                1.0F, 0.0F, 0.0F, 0.0F, 0.0F, // r                0.0F, 0.0F, 0.0F, 0.0F, 0.0F, // g                0.0F, 0.0F, 0.0F, 0.0F, 0.0F, // b                0.0F, 0.0F, 0.0F, 1.0F, 0.0F});// a        ColorMatrixColorFilter filter1 = new ColorMatrixColorFilter(colorMatrix1);        Paint p1 = new Paint();        p1.setXfermode(lightenXfermode);        p1.setColorFilter(filter1);        p1.setAlpha(255);        canvas.drawBitmap(srcBmp, 0.0F, 0.0F, p1);

1、ColorMatrix由一个5*4的浮点数组构造而成,每一行的第五个参数代表颜色的偏移值,四行各自代表rgba四个通道。

2、Paint 的setColorFilter方法

其声明如下:

public ColorFilter setColorFilter(ColorFilter filter)
ColorFilter有三个子类,ColorMatrixColorFilter、LightingColorFilter、PorterDuffFilter。主要是对图片的色彩进行类似滤镜的处理。

二、使用ColorFilter模拟光学相机的色相差

1、色差出现的原因

由于不同波长的光线的焦距不同,或者镜头对不同波长的光线放大程度不同,导致不同波长的光线没有聚焦到同一个焦平面,在图片上形成色散。

2、代码模拟

主要通过ColorFilter分离r、g、b三个通道的颜色,用不同的矩形绘制出来,来简单模拟图片边缘的色散现象。

        Bitmap tmpBmp = Bitmap.createBitmap(width, height, srcBmp.getConfig());        Canvas canvas = new Canvas(tmpBmp);        PorterDuffXfermode lightenXfermode = new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN);        Integer i1 = Integer.valueOf((int)((double)width * 0.006));        Integer i2 = Integer.valueOf(i1.intValue() * 2);        ColorMatrix colorMatrix1 = new ColorMatrix();        colorMatrix1.set(new float[]{                1.0F, 0.0F, 0.0F, 0.0F, 0.0F,                0.0F, 0.0F, 0.0F, 0.0F, 0.0F,                0.0F, 0.0F, 0.0F, 0.0F, 0.0F,                0.0F, 0.0F, 0.0F, 1.0F, 0.0F});        ColorMatrixColorFilter filter1 = new ColorMatrixColorFilter(colorMatrix1);        Paint p1 = new Paint();        p1.setXfermode(lightenXfermode);        p1.setColorFilter(filter1);        p1.setAlpha(255);        canvas.drawBitmap(srcBmp, 0.0F, 0.0F, p1);        ColorMatrix colorMatrix2 = new ColorMatrix();        colorMatrix2.set(new float[]{                0.0F, 0.0F, 0.0F, 0.0F, 0.0F,                0.0F, 1.0F, 0.0F, 0.0F, 0.0F,                0.0F, 0.0F, 0.0F, 0.0F, 0.0F,                0.0F, 0.0F, 0.0F, 1.0F, 0.0F});        p1.setColorFilter(new ColorMatrixColorFilter(colorMatrix2));        RectF r1 = new RectF((float)(-i1 / 2), (float)(-i1 / 2), (float)(i1 + width), (float)(i1 + height));        canvas.drawBitmap(srcBmp, (Rect)null, r1, p1);        ColorMatrix colorMatrix3 = new ColorMatrix();        colorMatrix3.set(new float[]{                0.0F, 0.0F, 0.0F, 0.0F, 0.0F,                0.0F, 0.0F, 0.0F, 0.0F, 0.0F,                0.0F, 0.0F, 1.0F, 0.0F, 0.0F,                0.0F, 0.0F, 0.0F, 1.0F, 0.0F});        p1.setColorFilter(new ColorMatrixColorFilter(colorMatrix3));        RectF r2 = new RectF((float)(-i2 / 2), (float)(-i2 / 2), (float)(i2 + width), (float)(i2 + height));        canvas.drawBitmap(srcBmp, (Rect)null, r2, p1);        srcBmp.recycle();
效果如下,可以看到图片的对比强烈的边缘有明显的红边或绿边。



原创粉丝点击