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