1.Matrix.
Android API中有一个Matirx类,当在现有位图对象上进行绘制或从另一个位图对象创建某个位图对象时,可以使用该类。这个类可以让我们对位图进行旋转、裁剪、缩放、平移等操作。
Matrix类是以9个float型数字的一维数组表示的。每个数字都对应于图像上每个点的3个坐标(x,y或z)之一。
Matrix matrix = new Matrix(); matrix.setValues(new float[] { 1, 0, 0, 0, 1, 0, 0, 0, 1 });
顶行(1,0,0)指定源图像的x坐标将根据以下公式转换:x=1*x+0*y+0*z。即顶行总会影响到目标图像的x坐标,但可以操作源图像的x,y,z坐标。
同理,第二行和第三行将影响目标图像的y和z坐标。
Matrix类有以下成员方法:
setRotate(), setScale(), setTranslate(), 而这几种方法还有个字之前之后的版本(preScale(), postRotate(), postTranslate()...),这使得我们可以每次按顺序完成一个以上的转换。
2.ColorMatrix
类似于在Canvas对象上绘制时使用Matrix对象的方法,也可以使用一个ColorMatrix对象来改变用于在Canvas对象上绘制的Paint对象。
同样,ColorMatrix也是一个浮点数数组,可以对图像的像素进行操作。然后不同于操作x, y和z坐标,它操作的是颜色值——每个像素的RGBA值。
ColorMatrix的使用方式:
ColorMatrix cm = new ColorMatrix(); paint.setColorFilter(new ColorMatrixColorFilter(cm));
即构建一个ColorMatrixColorFilter对象,并将它应用于Paint对象,从而使得ColorMatrix对象可以用来改变Canvas对象上的绘制内容。
如上默认的ColorMatrix是不会改变图像的,因为它形如:
1,0,0,0,0
0,1,0,0,0
0,0,1,0,0
0,0,0,1,0
第一行包含了在单个像素的红色部分上发生的操作,第二行影响绿色部分,第三行影响蓝色部分,最后一行操作的是Alpha值。
而与每行相乘的数字中,第一个数字是与像素的红色值相关联的乘数,第二个是绿色相关联,第三个是蓝色相关联,第四个是与Alpha相关联,而最后一个数字不与任何值相乘。
例如,如果想改变图像的对比度和亮度可以这样操作:
ColorMatrix cm = new ColorMatrix(); int contrast=2; int brightness=-25; cm.set(new float[] { contrast, 0, 0, 0, brightness, 0, contrast, 0, 0, brightness, 0, 0, contrast, 0, brightness, 0, 0, 0, 1, 0 }); //cm.setSaturation(.5f);//改变饱和度 paint.setColorFilter(new ColorMatrixColorFilter(cm));