`

Android——Matrix类

    博客分类:
  • View
阅读更多

在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型:

1、Translate————平移变换

2、Scale————缩放变换

3、Rotate————旋转变换

4、Skew————错切变换

在Android的API里对于每一种变换都提供了三种操作方式:set(用于设置Matrix中的值)、post(后乘,根据矩阵的原理,相当于左乘)、pre(先乘,相当于矩阵中的右乘)。默认时,这四种变换都是围绕(0,0)点变换的,当然可以自定义围绕的中心点,通常围绕中心点。

首先说说平移,在对图片处理的过程中,最常用的就是对图片进行平移操作,该方法为setTranslate(),平移意味着在x轴和y轴上简单地移动图像。setTranslate方法采用两个浮点数作为参数,表示在每个轴上移动的数量。第一个参数是图像将在x轴上移动的数量,而第二个参数是图像将在y轴上移动的数量。在x轴上使用正数进行平移将向右移动图像,而使用负数将向左移动图像。在y轴上使用正数进行平移将向下移动图像,而使用负数将向上移动图像。

再看缩放,Matrix类中另一个有用的方法是setScale方法。它采用两个浮点数作为参数,分别表示在每个轴上所产生的缩放量。第一个参数是x轴的缩放比例,而第二个参数是y轴的缩放比例。如:matrix.setScale(1.5f,1);
比较复杂的就是图片的旋转了,内置的方法之一是setRotate方法。它采用一个浮点数表示旋转的角度。围绕默认点(0,0),正数将顺时针旋转图像,而负数将逆时针旋转图像,其中默认点是图像的左上角,如:

Matrix matrix = new Matrix();
matrix.setRotate(15);

另外,也可以使用旋转的角度及围绕的旋转点作为参数调用setRotate方法。选择图像的中心点作为旋转点,如:
matrix.setRotate(15,bmp.getWidth()/2,bmp.getHeight()/2);

对于错切变换,在数学上又称为Shear mapping(可译为“剪切变换”)或者Transvection(缩并),它是一种比较特殊的线性变换。错切变换的效果就是让所有点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发生平移,且平移的大小和该点到x轴(或y轴)的垂直距离成正比。错切变换,属于等面积变换,即一个形状在错切变换的前后,其面积是相等的。

对于程序中,一个特别有用的方法对是setScale和postTranslate,它们允许跨单个轴(或者两个轴)翻转图像。如果以一个负数缩放,那么会将该图像绘制到坐标系统的负值空间。由于(0,0)点位于左上角,使用x轴上的负数会导致向左绘制图像。因此我们需要使用postTranslate方法,将图像向右移动,如:

matrix.setScale(-1, 1);
matrix.postTranslate(bmp.getWidth(),0);

可以在y轴上做同样的事情,翻转图像以使其倒置。通过将图像围绕两个轴上的中心点旋转180°,可以实现相同的效果,如
matrix.setScale(1, -1);
matrix.postTranslate(0, bmp.getHeight());

 

 Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。

        首先介绍一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处理,主要用到的是乘法 。下面是一个乘法的公式:

 

 

        在 Android 里面, Matrix 由 9 个 float 值构成,是一个 3*3 的矩阵。如下图。

        

没专业工具,画的挺难看。解释一下,上面的 sinX 和 cosX ,表示旋转角度的 cos 值和 sin 值,注意,旋转角度是按顺时针方向计算的。 translateX 和 translateY 表示 x 和 y 的平移量。 scale 是缩放的比例, 1 是不变, 2 是表示缩放 1/2,这样子。

        下面在 Android 上试试 Matrix 的效果。

Java代码  收藏代码
  1. public class MyView extends View {  
  2.   
  3.     private Bitmap mBitmap;  
  4.   
  5.     private Matrix mMatrix = new Matrix();  
  6.   
  7.     public MyView(Context context) {  
  8.   
  9.         super(context);  
  10.   
  11.         initialize();  
  12.   
  13.     }  
  14.   
  15.     private void initialize() {       
  16.   
  17.         mBitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();          
  18.   
  19.         float cosValue = (float) Math.cos(-Math.PI/6);  
  20.   
  21.         float sinValue = (float) Math.sin(-Math.PI/6);  
  22.   
  23.         mMatrix.setValues(  
  24.   
  25.                 new float[]{  
  26.   
  27.                         cosValue, -sinValue, 100,  
  28.   
  29.                         sinValue, cosValue, 100,  
  30.   
  31.                         002});  
  32.   
  33.     }  
  34.   
  35.     @Override protected void onDraw(Canvas canvas) {  
  36.   
  37. //      super.onDraw(canvas);  //当然,如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。  
  38.   
  39.         canvas.drawBitmap(mBitmap, mMatrix, null);  
  40.   
  41.     }  
  42.   
  43. }  

 运行结果如下:

        以左上角为顶点,缩放一半,逆时针旋转30度,然后沿x轴和y轴分别平移50个像素,代码 里面写的是100,为什么是平移50呢,因为缩放了一半。

       大家可以自己设置一下Matrix的值,或者尝试一下两个Matrix相乘,得到的值设置进去,这样才能对Matrix更加熟练。

 

这里讲的直接赋值的方式也许有点不好理解,不过还好, andrid 提供了对矩阵的更方便的方法。

分享到:
评论

相关推荐

    安卓Android源码——Matrix.rar

    这个压缩包"安卓Android源码——Matrix.rar"很可能包含了Matrix类的源代码,允许我们深入理解其内部工作原理。在本文中,我们将探讨Matrix类的核心概念、常用方法以及在Android图形绘制中的应用。 Matrix类提供了对...

    安卓Android源码——android相册系统(用Matrix实现).zip

    这个压缩包文件"安卓Android源码——android相册系统(用Matrix实现).zip"包含了一个使用Matrix类来实现的相册系统源码。Matrix是Android图形库中的一个关键类,它允许开发者对图像进行平移、旋转、缩放等变换操作。...

    安卓Android源码——android相册系统(用Matrix实现).rar

    这个压缩包“安卓Android源码——android相册系统(用Matrix实现).rar”显然提供了一个使用Matrix类来实现相册功能的示例代码。Matrix是Android SDK中的一个关键类,用于进行2D图像变换,如旋转、缩放、平移等。接...

    安卓Android源码——相册系统(用Matrix实现).zip

    本项目以“安卓Android源码——相册系统(用Matrix实现).zip”为主题,揭示了如何利用Matrix类来实现相册功能。Matrix是Android图形库中的一个核心类,用于处理2D图形变换,如缩放、旋转、平移等。以下是关于这个主题...

    Android——Canvas切割出扇形表盘式进度

    接下来是Matrix,它是Android图形系统中的一个关键类,用于对几何图形进行旋转、缩放、平移和倾斜等变换。在创建扇形时,我们需要用Matrix来旋转我们的画布或Path,以便按照弧度绘制出扇形部分。我们可以使用`...

    Android——仿美图秀秀和IOS系统的相机胶卷.zip

    在本项目中,"Android——仿美图秀秀和IOS系统的相机胶卷"是一个安卓应用程序,旨在模拟美图秀秀的图像编辑功能以及iOS设备的相机胶卷界面。这个项目涵盖了多个Android开发的重要知识点,包括用户界面设计、图片处理...

    2011.10.12(3)——— android Matrix学习02

    这篇博客“2011.10.12(3)——— android Matrix学习02”可能深入探讨了Matrix类的使用方法,虽然具体的细节没有给出,但我们可以根据Matrix的基本功能和常见用法来展开讨论。 1. **Matrix类的介绍**:Matrix是...

    2011.10.13(2)——— android Matrix学习03

    这篇博客“2011.10.13(2)——— android Matrix学习03”可能深入探讨了Matrix类的一些高级用法和实践技巧。虽然描述中没有提供具体信息,但从标题可以推断,这可能是系列教程的第三部分,继续深化对Matrix的理解。...

    zxing源码分析——DataMatrix码部分

    zxing 源码分析——DataMatrix 码部分 本文主要讲述了 zxing 源码中 DataMatrix 码部分的代码结构和解码流程。DataMatrix 码是一种二维码,zxing 是一个 Java 库,用于解析和生成各种二维码。 在 zxing 源码中,...

    Android——仿美图秀秀和IOS系统的相机胶卷.rar

    - Android提供了`MediaStore`类,用于访问设备上的媒体库,如图片、视频等。通过查询`ContentResolver`,可以获取到设备上的所有图片信息。 - 使用`Cursor`遍历`MediaStore.Images.Media`表,获取图片的路径、日期...

    安卓Android源码——MatrixText.rar

    Matrix类是Android图形库中的核心类,它提供了2D坐标变换功能,包括旋转、缩放、平移和斜切等。MatrixText则将这些变换应用到文本上,使文本能够按照指定的Matrix进行变形。 2. **MatrixText的使用** 在Android中...

    Android——实现光点模糊渐变的自旋转圆环特效,实现水滴波纹特效

    3. **BitmapShader**:可以使用BitmapShader配合Matrix来实现波纹扩散的图像效果。通过矩阵变换,让Shader中的图案在特定方向上平铺,形成波纹扩散的视觉感。 4. **Canvas的drawCircle()或drawOval()**:用来绘制...

    安卓Android源码——放大镜功能源码.zip

    这个压缩包“安卓Android源码——放大镜功能源码.zip”提供了实现这一功能的具体代码示例。下面,我们将深入探讨放大镜功能的原理、实现方式以及可能涉及的关键知识点。 1. **放大镜原理**: 放大镜功能在Android...

    安卓Android源码——3D相册图片滑动+倾斜+放大+倒影处理源码.zip

    Android提供了ScaleGestureDetector类来帮助识别这种手势,然后通过调整图片的缩放因子(scale factor),并更新Matrix,使图片按比例放大或缩小。 倒影效果则是通过对原始图片进行镜像翻转并叠加到原图下方来实现...

    Android基础控件——ImageView的自定义,巧用Matrix实现图片不变形的炫酷PK条

    这个过程中,Matrix类起着至关重要的作用。Matrix是Android图形处理中的核心组件,它可以对图像进行旋转、缩放、平移等操作,而不会破坏图像的原始比例,从而避免图片变形。 首先,我们需要了解Matrix的基本用法。...

    安卓Android源码——仿美图秀秀拼图功能.zip

    本项目"安卓Android源码——仿美图秀秀拼图功能"就是一个很好的实例,它提供了一个类似美图秀秀的图片拼接功能。下面我们将详细探讨这个项目中的关键知识点。 1. **图片处理**: - 图片拼接:在Android中,我们...

    安卓Android源码——二维码扫描案例.zip

    本案例的“安卓Android源码——二维码扫描案例.zip”提供了一个具体的实现示例,其中包含了名为“CaptureActivity”的核心类。下面我们将深入探讨这个案例中的关键知识点。 1. **ZXing库**:二维码扫描功能通常基于...

    安卓Android源码——android-flip 类似Flipboard翻转动画的实现.zip

    "安卓Android源码——android-flip 类似Flipboard翻转动画的实现.zip"是一个专注于实现类似Flipboard应用中的翻转动画效果的开源项目。Flipboard是一款著名的新闻阅读应用,以其优雅的翻页效果闻名,这种效果在用户...

    安卓Android源码——常用图片特效处理源码.zip

    3. 图片旋转:使用Matrix类可以实现图片的旋转。通过setRotate()方法设置旋转角度,然后调用Bitmap.createBitmap(),使用修改后的Matrix进行绘制。 4. 裁剪圆角:可以利用PorterDuffXfermode和Paint对象,通过画布...

    Android源码——图片浏览功能源码.zip

    这通常通过Matrix类实现,Matrix可以用来对图像进行旋转、缩放、平移等变换。源码中会监听手指间的距离变化来判断是缩放还是平移,然后更新Matrix并应用到ImageView上。 5. **内存管理**:在处理大量图片时,内存...

Global site tag (gtag.js) - Google Analytics