3.3.1 输入矩阵
Android API有一个Matrix(矩阵)类,当在现有位图对象上进行绘制或从另一个位图对象创建某个位图对象时,可以使用该类。这个类使得我们能够在一幅图像上应用空间转换。这种类型的转换可以是旋转,裁剪,缩放或者更改图像的坐标空间。
Matrix类是以9个数字的数组表示转换。在许多情况下,这些数字可以由一个公式生成,该公式在数学上表示用该发生的转换。例如,对于旋转公式,通过使用正弦和余弦生成矩阵中的数字。
Matrix类中的数字也可以手动输入。为了了解Matrix类如何工作,我们将以一些手动转换开始。
Matrix类中的每个数字都将应用于图像上每个点的3个坐标(x,y,z)之一。
例如,下面的是一个包含9个浮点数的矩阵:
1 0 0
0 1 0
0 0 1
顶行(1,0,0)指定源图像的x坐标将根据以下公式转换:x=1x+0y+0z。正如你所看到的,值在矩阵中放置的位置决定对应数字将会如何影响结果。顶行总是会影响到x坐标,但可以操作源图像的x、y和z坐标。
第二行(0,1,0)意味着y坐标将被确定为y=0x+1y+0z,第三行(0,0,1)意味着z=0x+0y+1z。
换句话说,这个矩阵不会做任何转换;所有内容都会按照它在源图像中的情况放置。
为了在代码中实现这一点,我们将创建Matrix对象,然后通过其setValues方法显式地设置值。
1 Matrix matrix=new Matrix(); 2 matrix.setValues(new float[]{1,0,0,0,1,0,0,0,1});
当在画布上绘制一张位图时,可以使用该Matrix对象。
1 canvas.drawBitmap(bmp, matrix, paint);
这将代替之前示例中使用的drawBitmap方法。
为了使得Matrix对象以某种方式更改图像,可以用不同的值替换任何一个现有的数字。如果将第一个数字从1改成0.5,那么将在x轴上将图像压缩50%,第一个数字会作用于源图像的x坐标,从而影响结果图像的x坐标。
0.5 0 0
0 1 0
0 0 1
1 Matrix matrix=new Matrix(); 2 matrix.setValues(new float[]{0.5,0,0,0,1,0,0,0,1}); 3 canvas.drawBitmap(bmp, matrix, paint);
如果改变矩阵,使x坐标也受源位图的y坐标影响,那么可以修改第二个数字。
1 Matrix matrix=new Matrix(); 2 matrix.setValues(new float[]{1,0.5,0,0,1,0,0,0,1}); 3 canvas.drawBitmap(bmp, matrix, paint);
正如所看到的那样,这会导致图像倾斜。它是因为第一行数字而发生倾斜,其操作每个像素的x值,根据每个像素的y值进行改变。随着y值增加,因为想图像的下部移动,所以x值增加,从而导致图像倾斜。如果使用一个负值,那么图像将以相反的方向倾斜。同时,还将注意到该图像由于坐标变化而被截断。因此,如果要执行这样的操作,那么需要增加结果位图的大小。
1 alteredBitmap=Bitmap.createBitmap(bmp.getWidth()*2, bmp.getHeight(), bmp.getConfig());
这些矩阵转换非常强大;同时我们也会发现手动处理他们会很麻烦。但是,对于大部分想要手动处理矩阵而实现的工作,他们对应的公式所需要的数学知识超出了本书的范围。然而,如果有兴趣深入学习,那么网上有足够多的资源。一个好的起点是Wikipedia的Transformation Matrix(转换矩阵)文章:http://en.wikipedia.org/Transformation_matrix。
posted on 2014-08-23 11:11 宁静致远,一览众山小 阅读(341) 评论(0) 编辑 收藏 举报