首页 > 其他分享 >Android开发 - Matrix 处理图像变换解析

Android开发 - Matrix 处理图像变换解析

时间:2024-09-05 18:36:32浏览次数:8  
标签:Matrix 缩放 float 2f new Android 解析 matrix

Matrix 是什么

  • Matrix 是一个用于处理图像变换,它可以对图像进行缩放旋转平移和倾斜等操作。通俗来讲,Matrix 就像是一个数学公式,用来定义如何改变图像的位置形状或者方向

Matrix 的主要功能

  • 缩放(Scale):可以改变图片的大小,比如放大或缩小

  • 旋转(Rotate):可以将图片绕某个点旋转一定的角度

  • 平移(Translate):可以移动图片的位置

  • 倾斜(Skew):可以让图片变形,比如将图片斜着拉长

  • 这些操作都可以通过修改 Matrix 来实现,Matrix 是一个 3x3 的矩阵,表示对图像的变换方式

主要方法解析

  • matrix.set(Matrix matrix):将一个矩阵的值复制到当前矩阵

    Matrix matrix1 = new Matrix();
    Matrix matrix2 = new Matrix();
    matrix1.setScale(2f, 2f);
    matrix2.set(matrix1);  // 把 matrix1 的值赋给 matrix2
    
    • 参数解析
      • matrix当前 matrix 对象
  • matrix.setScale(float sx, float sy)缩放图片

    Matrix matrix = new Matrix();
    matrix.setScale(2f, 2f);  // 把图片放大两倍
    
    • 参数解析
      • sx横向缩放比例;值大于 1 表示放大,值小于 1 表示缩小
      • sy纵向缩放比例;值大于 1 表示放大,值小于 1 表示缩小
  • matrix.setRotate(float degrees)旋转图片

    Matrix matrix = new Matrix();
    matrix.setRotate(45);  // 旋转45度
    
    • 参数解析
      • degrees旋转的角度正数表示顺时针旋转负数表示逆时针旋转
  • matrix.setTranslate(float dx, float dy)移动图片

    Matrix matrix = new Matrix();
    matrix.setTranslate(100, 200);  // 将图片向右移动100像素,向下移动200像素
    
    • 参数解析
      • dx横向移动距离
      • dy纵向移动距离
  • matrix.setSkew(float kx, float ky)倾斜图片;它可以让图片产生类似于拉长拉伸的效果

    Matrix matrix = new Matrix();
    matrix.setSkew(0.5f, 0.2f);  // 使图片横向倾斜0.5,纵向倾斜0.2
    
    • 参数解析
      • kx横向倾斜系数
      • ky纵向倾斜系数
  • matrix.postTranslate(float dx, float dy):基于现有的变换再做移动操作

    Matrix matrix = new Matrix();
    matrix.setScale(2f, 2f);
    matrix.postTranslate(100f, 100f);  // 先缩放再平移
    
    • 参数解析
      • dx追加的横向移动距离
      • dy追加的纵向移动距离
  • matrix.postScale(float sx, float sy):基于当前变换追加缩放操作

    Matrix matrix = new Matrix();
    matrix.setTranslate(50f, 50f);
    matrix.postScale(2f, 2f);  // 先平移,再缩放
    
    • 参数解析
      • kx追加的横向缩放系数
      • ky追加的纵向缩放系数
  • matrix.postRotate(float degrees):基于现有的矩阵进行旋转操作

    Matrix matrix = new Matrix();
    matrix.setScale(1.5f, 1.5f);
    matrix.postRotate(45);  // 先缩放再旋转
    
    • 参数解析
      • degrees追加的旋转角度
  • matrix.postSkew(float kx, float ky):在已有的矩阵操作上追加倾斜操作

    Matrix matrix = new Matrix();
    matrix.setScale(2f, 2f);
    matrix.postSkew(0.5f, 0.5f);  // 先缩放再倾斜
    
    • 参数解析
      • kx追加的横向倾斜系数
      • ky追加的纵向倾斜系数
  • matrix.invert(Matrix inverse):用于求当前矩阵逆矩阵,如果当前矩阵可逆的,会将逆矩阵存储到 inverse 参数中,返回 true,否则返回 false

    Matrix matrix = new Matrix();
    matrix.setScale(2f, 2f);
    Matrix inverseMatrix = new Matrix();
    boolean isInvertible = matrix.invert(inverseMatrix);  // 计算逆矩阵
    
    • 参数解析
      • inverse:用于得出的 当前matrix 对象 是否为逆矩阵
  • matrix.mapRect(RectF rect):对矩形进行变换矩形会根据当前矩阵进行缩放平移旋转等变换

    Matrix matrix = new Matrix();
    matrix.setScale(2f, 2f);
    RectF rect = new RectF(0, 0, 100, 100);
    matrix.mapRect(rect);  // 变换后的矩形坐标会改变
    
    • 参数解析
      • rect:接收一个重定矩形RectF 对象
  • matrix.mapRect(RectF rect):将当前的矩阵重置为单位矩阵单位矩阵初始状态,表示没有任何变换

    Matrix matrix = new Matrix();
    matrix.setScale(2f, 2f);
    matrix.reset();  // 重置为单位矩阵
    
  • matrix.preTranslate(float dx, float dy):在已有矩阵操作之前进行平移

    Matrix matrix = new Matrix();
    matrix.setScale(2f, 2f);
    matrix.preTranslate(50f, 50f);  // 先平移再缩放
    
      • 参数解析
        • dx横向移动距离
        • dy纵向移动距离
  • matrix.preScale(float sx, float sy):在已有矩阵操作之前进行缩放

    Matrix matrix = new Matrix();
    matrix.setScale(2f, 2f);
    matrix.preTranslate(50f, 50f);  // 先平移再缩放
    
      • 参数解析
        • sx横向缩放比例
        • sy纵向缩放比例
  • matrix.preRotate(float degrees):在已有矩阵操作之前进行旋转

    Matrix matrix = new Matrix();
    matrix.setTranslate(100f, 100f);
    matrix.preRotate(45);  // 先旋转再平移
    
      • 参数解析
        • degrees旋转的角度
  • matrix.preSkew(float kx, float ky):在已有矩阵操作之前进行倾斜

    Matrix matrix = new Matrix();
    matrix.setScale(2f, 2f);
    matrix.preSkew(0.5f, 0.5f);  // 先倾斜再缩放
    
    • 参数解析
      • kx横向倾斜系数
      • ky纵向倾斜系数
  • matrix.setConcat(Matrix a, Matrix b):将两个矩阵相乘,并将结果赋给当前矩阵。相当于 Matrix乘法运算

    Matrix matrix1 = new Matrix();
    matrix1.setScale(2f, 2f);
    
    Matrix matrix2 = new Matrix();
    matrix2.setRotate(45);
    
    Matrix result = new Matrix();
    result.setConcat(matrix1, matrix2);  // 将 matrix1 和 matrix2 组合
    
    • 参数解析
      • a要组合的第一个 Matrix 对象
      • b要组合的第二个 Matrix 对象
  • matrix.setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount):将源点数组 src 变换为目标点数组 dst。可以指定多少个点参变换,允许更复杂几何操作。主要将源多边形多个点通过变换映射到目标多边形相应点。通过指定多个点,Matrix 会计算出从源点目标点变换矩阵

    Matrix matrix = new Matrix();
    float[] src = {0f, 0f, 100f, 0f};   // 源多边形的两个点:两个点为 (0, 0) 和 (100, 0)
    float[] dst = {0f, 0f, 150f, 50f};  // 目标多边形的两个点:目标点为 (0, 0) 和 (150, 50
    matrix.setPolyToPoly(src, 0, dst, 0, 2);  // 使用两个点进行变换。srcIndex 和 dstIndex 都为 0,表示从第一个点开始使用。pointCount 为 2,表示我们使用两个点来计算变换
    
    • 参数解析
      • src源点数组,包含源多边形所有点坐标。这个数组顺序存储坐标信息数组的长度应该是 2 * nn点的数量每个点两个连续的浮点数表示,分别是 x 和 y 坐标。例如:src = {x1, y1, x2, y2, x3, y3, ...}
      • srcIndex源点数组的起始索引,从这个位置开始读取源点数据。例如:如果 srcIndex = 0,则从 src 数组第一个点开始使用;如果 srcIndex = 2,则从数组中的第三个浮点数(即第二个点的 x 坐标)开始使用
      • dst目标点数组,包含目标多边形所有点的坐标。这个数组src 类似,也按顺序存储目标多边形的坐标。Matrix 会根据这些计算变换矩阵,将源多边形映射到这些目标点
      • dstIndex目标点数组的起始索引,从这个位置开始读取目标点数据。例如:如果 dstIndex = 0,则从 dst 数组第一个点开始使用;如果 dstIndex = 2,则从数组中的第三个浮点数(即第二个点的 x 坐标)开始使用
      • pointCount参与变换的点的数量pointCount 决定了 srcdst 中的有多少个会被用于计算变换矩阵最多支持 4 个点的变换,具体的点数决定了变换的复杂程度
        • 1个点:只能实现平移
        • 2个点:可以实现平移缩放(单轴或双轴缩放)
        • 3个点:可以实现平移缩放旋转
        • 4个点:可以实现平移缩放旋转任意形变(透视变换)

如何使用 Matrix

  • Matrix 一般和 CanvasBitmap 结合使用,可以将这些变换应用到图片或绘制的元素上。例如,在自定义控件中绘制一个经过旋转或缩放的图像时,可以使用 Matrix 来对图像进行变换

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Matrix matrix = new Matrix();
        matrix.setScale(1.5f, 1.5f);  // 对图片进行1.5倍放大
        canvas.drawBitmap(bitmap, matrix, null);  // 绘制变换后的图片
    }
    

总结

  • Matrix 本质上是一个数学工具,用于图像的几何变换

  • 通过操作 Matrix,可以对图片进行缩放、旋转、移动、倾斜等操作,改变其在屏幕上的显示方式

标签:Matrix,缩放,float,2f,new,Android,解析,matrix
From: https://www.cnblogs.com/ajunjava/p/18399020

相关文章

  • Android BLE & BluetoothGattCallback.onServicesDiscovered不回调或部分回调解决
    A.如题,调用BluetoothGatt.discoverServices()返回true了,但是一直没走到onServicesDiscovered回调中,用Ble调试蓝牙助手测试了,也是一样的情况,所以应该是外设的问题,但是ios的没问题,蓝牙处理还是有差别,网上有一种方式说是延迟去多discoverServices几次,可能可以找到,尝试了一下还是不行......
  • 万字解析qinguoyi / TinyWebServer项目的源码
    前言项目地址项目详细介绍本文章适合刚学习完C++基础知识并尝试实现一个网络编程项目的同学,其中包含了该项目的代码逐行注释和解析以及许多刚学习网络编程中会遇到的疑问。项目简介:Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器.使用线......
  • Android平台RTSP|RTMP播放器之视音频效果设置
    RTSP|RTMP播放器模块是大牛直播SDK的SmartMediaKit下非常优异的子产品,功能丰富、性能优异,毫秒级超低延迟,支持Windows、Linux(x86_64|aarch64架构)、Android、iOS平台。先看demo主界面,可以通过界面,做基础的设置,比如旋转、镜像等操作。下面就视音频效果,做个大概的介绍。视频填充效果:......
  • MySQL索引与事务(详细解析)
    目录1.索引作用 优势:2.索引的使用 2.1查看索引 2.2创建索引2.3删除索引 3.索引的数据结构4.事务 4.1事务的概念 4.2事务的使用 1.索引作用 优势: --索引类似一本书的目录,加快提高的查询的效率 --索引会额外的占用磁盘的空间,可能会拖慢插入......
  • 《国家崛起》MSXML故障全解析:从诊断到修复的实战指南
    一、引言《国家崛起》作为一款经典的实时策略游戏,其稳定运行依赖于多个系统组件的支持,其中MSXML(MicrosoftXMLCoreServices)是不可或缺的一部分。MSXML用于处理游戏中的XML数据交换,如果出现故障,可能会导致游戏无法正常运行、报错或启动失败。本指南将全面解析《国家崛起》中M......
  • 解析和操作HTML文档,并进行同级或跨级匹配元素
      一、插件描述HtmlAgilityPack是一个C#的开源库,它提供了解析和操作HTML文档的功能。它是一个非常流行的工具,可以在C#环境中轻松地处理HTML内容。使用HtmlAgilityPack,你可以加载HTML文档,并使用XPath表达式来选择和操作文档中的元素。你可以通过HtmlNode对......
  • 基于 Python 的地址解析:自动识别姓名、电话、地址、详细地址与省市区
    随着电子商务和物流行业的蓬勃发展,自动化处理客户提供的收货信息变得尤为重要。在用户下单时,通常需要输入姓名、电话、地址等信息,但由于输入格式不统一,手动处理这些数据十分繁琐且容易出错。因此,利用Python自动解析用户输入的地址信息,提取姓名、电话、详细地址和省市区成为了许多......
  • Android之JNI开发
    JNIJNI是JavaNativeInterface的缩写,俗称Java本地接口,是Java语言提供的用于Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以通过JNI调用Java代码。那什么场景下可能会用到JNI呢?1、需要提升性能时,比如说做一些底层的开发,例如音视频处理之类......
  • Android Auto认证流程及资料
    AndroidAuto认证是谷歌官方对车辆信息娱乐系统的一种认可,表明该系统已经过严格测试,符合AndroidAuto平台的标准和要求。通过认证,确保车辆信息娱乐系统能够与AndroidAuto应用程序无缝集成,提供流畅的用户体验,同时保证系统的安全性和稳定性。AndroidAuto认证项目:1.车载娱乐系统兼容......
  • Android平台RTSP|RTMP播放器(SmartPlayer)集成必读
    技术背景好多开发者拿到大牛直播SDK的Android平台RTSP、RTMP播放模块,基本上不看说明,测试后,就直接集成到自己系统了。不得不说,我们的模块虽然接口很多,功能支持全面,但是上层的demo设计逻辑确实简单,稍微有些Android开发基础的,都可以轻松处理。从高效率的角度,磨刀不误砍柴工,在模块集成......