ColorMatrix的使用

一、概述

使用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();
效果如下,可以看到图片的对比强烈的边缘有明显的红边或绿边。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值