3.4.1 ColorMatrix

    类似于在Canvas对象上绘制Matrix对象的方法,也可以使用一个ColorMatrix对象来改变用于在Canvas对象上绘制的Paint对象。

    同样,ColorMatrix以类似的方式工作。它是一个数字数组,可以对图像的像素进行操作。然而不同于操作x、y和z坐标,它操作颜色值——每个像素的Red(红)、Green(绿)、Blue(蓝)和Alpha值。

    通过调用其没有任何参数的构造函数,我们可以构建一个默认的ColorMatrix对象。

1 ColorMatrix cm=new ColorMatrix();

    使用ColorMatrix对象构建一个ColorMatrixColorFilter对象,并将它应用于Paint对象,从而使得这个ColorMatrix对象可用来改变Canvas对象上的绘制内容。

1                 ColorMatrix cm=new ColorMatrix();
2                 ColorMatrixColorFilter cmf=new ColorMatrixColorFilter(cm);
3                 paint.setColorFilter(cmf);

    为了能够对ColorMatrix对象进行试验,可以简单的将它插入到“选择图片”实例中的绘图部分。

 1                 Bitmap bmp=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri),null,bmpBitmapFactoryOptions);
 2                 Bitmap alteredBitmap=Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
 3                 alteredBitmap=Bitmap.createBitmap(bmp.getWidth()*2, bmp.getHeight(), bmp.getConfig());
 4                 Canvas canvas=new Canvas(alteredBitmap);
 5                 Paint paint=new Paint();
 6                 ColorMatrix cm=new ColorMatrix();
 7                 paint.setColorFilter(new ColorMatrixColorFilter(cm));
 8                 Matrix matrix=new Matrix();
 9                 canvas.drawBitmap(bmp, matrix, paint);
10                 alteredImageView.setImageBitmap(alteredBitmap);
11                 chosenImageView.setImageBitmap(bmp);

    默认的ColorMatrix对象就是所谓的标识,就像默认的Matrix对象一样,当应用它时不会改变图像。查看以下这个数组所包含的内容将帮助我们理解他们怎么工作。

    1  0  0  0  0

    0  1  0  0  0

    0  0  1  0  0

    0  0  0  1  0

    这是一个包含了20个浮点数的数组。第一行包含了在单个像素的红色部分上发生的操作,第二影响绿色部分,第三行操作蓝色部分,而最后一行操作像素的Alpha值。

    在每一行中,第一个数字是与像素的红色值相关联的乘数,第二个数字是与绿色值相关联的乘数,第三个数字与蓝色相关,第四个数字是与Alpha值,而最后一个数字不会与任何值相乘。将这些值都加起来以改变他们这在操作的像素。

   假设现在有一个中等灰度的像素,其红色值为128,蓝色值为128,绿色值为128,Alpha值为0(他是不透明的)。如果通过上面的颜色矩阵来操作这个像素,那么数学公式将看起来如下所示:

    新的红色值=1*128+0*128+0*128+0*0+0

    新的绿色值=0*128+1*128+0*128+0*0+0

    新的蓝色值=0*128+0*128+1*128+0*0+0

    新的Alpha值=0*128+0*128+0*128+1*0+0

   所有的值都将保持不变,设置为128.对于用于像素的任何颜色变量,情况都是如此,因为每一行在操作代表他的颜色的位置都有一个1,而在其他位置均为0。

   如果只想让一幅图像看起来比之前红两倍,那么可以将操作所有像素的红色值的数字增加为2以替换1。这将使矩阵中的红色值翻倍。

    2  0  0  0  0

    0  1  0  0  0

    0  0  1  0  0

    0  0  0  1  0

    为了在代码中实现这个功能,可以执行如下操作:

1                 ColorMatrix cm=new ColorMatrix();
2                 cm.set(new float[]{
3                     2,0,0,0,0,
4                     0,1,0,0,0,
5                     0,0,1,0,0,
6                     0,0,0,1,0
7                 });
8                 paint.setColorFilter(new ColorMatrixColorFilter(cm));

    相应的,可以通过该矩阵对任何颜色进行类似的处理。

posted on 2014-08-25 10:24  宁静致远,一览众山小  阅读(392)  评论(0编辑  收藏  举报

导航