对Matrix中preTranslate()和postTranslate()的理解

安卓开发-图像处理-使用Matrix操作图片 安卓开发-图像处理-使用Matrix操作图片 在Android中,通过Matrix来对图片进行缩放、旋平移等。 相关API: Matrix.postScale(float sx,float sy) //缩放 Matrix.postRotate(float degrees)//旋转 Matrix.postTranslate(float dx,float dy)//平移 Matrix.... 阅读详情

前言

  因为在看郭霖大神的博客时有关于Matrix结合Camera实现图片的3D旋转,而其中Matrix的preTranslate()和postTranslate()方法当时不是太了解。关于android中对图片处理的内容我没怎么看过,所以不会也是在情理之中。但是既然想看会图片的3D旋转,这个又是必须要过的关,所以还是看了一点资料,发现原来只是我理解错了,并没有那么难,本文就是说说我当时是怎么理解的。

实现

  先来看一下效果图:


  可以看到一张原图和三张处理之后的图,左边和右边的图的上部和底部不是对称的,只有中间的那张图是对称的,我希望得到的结果图片就是中间的那张。为什么会出现三张不同的旋转图片呢?原因是旋转中心不一样。

  我们先来看一下源码:

public class MainActivity extends AppCompatActivity {

    private ImageView view2,view3,view4;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        view2  = (ImageView) findViewById(R.id.iv2);
        view3  = (ImageView) findViewById(R.id.iv3);
        view4  = (ImageView) findViewById(R.id.iv4);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.i004);
        /**
         * 旋转中心为(0,0)
         */
        Matrix matrix = getMatrix();
        Bitmap bit = getBitmap(bitmap, matrix);
        view2.setImageBitmap(bit);

        /**
         * 旋转中心为(0,height/2)
         */
        matrix = getMatrix();
        matrix.preTranslate(0, -bitmap.getHeight() / 2);
        matrix.postTranslate(0, bitmap.getHeight() / 2);
        bit = getBitmap(bitmap, matrix);
        view3.setImageBitmap(bit);

        /**
         * 旋转中心为(0,height)
         */
        matrix = getMatrix();
        matrix.preTranslate(0, -bitmap.getHeight());
        matrix.postTranslate(0,bitmap.getHeight());
        bit = getBitmap(bitmap, matrix);
        view4.setImageBitmap(bit);

    }

    private Bitmap getBitmap(Bitmap bitmap, Matrix matrix) {
        return Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
    }

    @NonNull
    private Matrix getMatrix(){
        Matrix matrix = new Matrix();
        Camera camera = new Camera();
        camera.save();
        camera.rotateY(45);
        camera.getMatrix(matrix);
        camera.restore();
        return matrix;
    }
}

  左边图片:

  从源码中我们看到,左边图片我们对Matrix没有做任何处理,所以Camera的rotateY()方法在以y轴旋转的时候,旋转中心是(0,0),如下图所示:


  因为旋转中心并不在图片的对称点上,所以得到的结果就是图片上下不对称。

  中间图片:
  中间的图片是对称的,那么是如何得到的呢?按照前面所说,因为旋转的中心是(0,0)不在图片的对称点上,那么我们只要让旋转中心在对称点上就可以了,这就要说preTranslate()和postTranslate()方法了,这两个方法可以实现我们所谓的旋转中心的改变,其实也没变,只是将图片以矩阵的形式进行操作,达到与旋转中心改变一样的效果罢了。

matrix.preTranslate(0, -bitmap.getHeight());
matrix.postTranslate(0,bitmap.getHeight());

  这两行代码就是起到了这样的作用。preTranslate方法的作用是在旋转之间先把图片向上移动图片高度的一半的距离,这样图片就关于x轴对称了,然后再进行旋转的变换,postTranslate方法是在变换之后再将图片向下移动图片高度的一半的距离也即是回到了原来的位置,这样图片显示出来的结果就是对称的了。原理也很简单,旋转中心还是(0,0),只不过我们移动图片,这样进行旋转变换的时候就会得到对称的结果了。

小结

  好了,这个问题搞懂了,继续去看郭神的博客去了。

详谈Matrix中preTranslate()和postTranslate()的理解 主要为大家详细介绍了Matrix中preTranslate()和postTranslate()的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 立即下载

相关推荐

开源CC6920差分霍尔电流传感器模块实战指南——从选型到波形分析

本文详细介绍了CC6920差分霍尔电流传感器模块的选型、硬件连接、参数计算及波形分析技巧。通过实战案例,展示了该开源硬件在电流测量中的优势,包括超低内阻、电气隔离和抗干扰能力,适用于电机控制、开关电源保护等场景。

weixin_28738397的博客 377

Android postTranslate和preTranslate的理解

matrix.setScale(interpolatedTime, interpolatedTime); matrix.preTranslate(-centerX, -centerY); matrix.postTranslate(centerX, centerY); 经常在中心缩放的应用中看到这段代码. pre...

weixin_30859423的博客 403

数据可视化—power bi 基础操作汇总

数据来源: https://pan.baidu.com/s/1U_Y7rKfhnSKbLmh4FcUD_Q 提取码: yq5v 目录 基本功能与视图 编辑与查询—修改column案例 建立关联性 新增column与DAX完成总价运算 习题练习1:建立可视化图表 产品销售统计图 column拖曳可视化 1.基本功能与视图 ①基础操作界面 ②获取数据—以打开excel为例 ③数据文件基本视图 可视化形式:柱状图、数据、关联性 2.编辑与查询—修改column ①编辑与查询—数据处理界面 .

weixin_52730784的博客 2682

Matrix 基本使用方法(一)

  java.lang.Object    ↳   android.graphics.Matrix     Public Constructors Matrix() Create an identity matrix Matrix(Matrix src) Create a matrix that is a (dee...

一切皆有可能 1830

第5.1节 构网控制:电压源特性与电压调节

摘要: 构网型变流器的核心物理本质是作为可控交流电压源,通过戴维南等效模型(受控电势源+低输出阻抗)自主建立并调节电压,增强电网电压刚度。其电压调节通过无功-电压闭环控制实现,内环为自动电压调节器(AVR),外环为无功-电压下垂特性,模拟同步发电机功能。关键技术包括自适应增益、虚拟阻抗补偿及动态限流策略,以应对弱电网稳定性、故障过流等问题。该设计满足《规范》对电压调节范围、动态无功支撑的要求,是高比例新能源电力系统电压稳定的关键解决方案。

技术工作者 1110

机器人抓取(一)—— ROS MoveIt! 程序控制真实UR5机器人运动(python)

接上篇:ubuntu18.04 ros-melodic 安装 ur_robot_driver,驱动真实的 ur5 机器人 上文在 ubuntu 系统中配置了ur 机器人ros功能包 universal_robot 和驱动 Universal_Robots_ROS_Driver,并实现了用 moveit_rviz 拖动机器人运动。本文旨在学习如何使用 moveit python 用户接口moveit_commander,实现真实的ur5 机器人轨迹规划与控制。 1. ur5 机器人控制 参考:MoveIt »

zxxRobot的博客 1万+

配合Came使用_Matrix中preTranslate()和postTranslate()的理解

前言   因为在看郭霖大神的博客时有关于Matrix结合Camera实现图片的3D旋转,而其中Matrix的preTranslate()和postTranslate()方法当时不是太了解。关于android中对图片处理的内容我没怎么看过,所以不会也是在情理之中。但是既然想看会图片的3D旋转,这个又是必须要过的关,所以还是看了一点资料,发现原来只是我理解错了,并没...

liujian8654562的博客 274

SAPABAP金色传说:关于导入和导出Excel时反复弹窗提示 SAP GUI安全性问题的解决方法

文章目录前言一、提示的到底是什么?二、关闭SAP GUI安全提示的步骤1.设置位置 前言 如果你在SAP中,经常需要将数据导出Excel,或者使用Excel进行批导数据,那么你对下面这个频繁出现的弹窗提示一定不陌生! 系统试图创建文件 C:\Users\15265\Desktop\EXPORT.XLSX 于目录 C:\Users\15265\Desktop\ 是否要授权修改父目录及其所有子目录? 不管你是不是选的记住我的决定,它必出!就很烦!那如何处理才能关闭呢? 提示:以下是本篇文章正文内容,看完快

Easystudios博客 1万+

Matrix.preTranslate和 postTranslate

实际上在图形学中,这些平面图形的变换都是以矩阵的形式存在的。先来回顾一下,下面,左中右分别scale(缩放),rotation(旋转)和 translation(平移)在Android中的矩阵表示: 如果只是单纯的应用某一个变换,我们都知道直接用矩阵去乘上对应的点就可以了。但是对于缩放和旋转来说,它们的轴点是基于原点(0,0)的,如下图,我们将它缩小1倍,代码如下:vcD4KPH

冬雪秋风的博客 6562

手把手教你排查libstdc++.so.6版本问题:从GLIBCXX缺失到完美解决

本文深入解析Linux系统中常见的GLIBCXX版本缺失问题,以`ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.29' not found`为例,从动态链接原理入手,提供使用`strings`和`find`命令的诊断方法,并详细对比了四种解决方案的优缺点。文章重点推荐通过设置`LD_LIBRARY_PATH`或更新系统库的安全策略,并最终建议使用Docker容器化技术实现环境依赖的根治与统一管理。

j7k8l的博客 300

基于Ultralytics RT-DETR的工业缺陷检测实战:从NEU-DET数据集准备到模型部署

本文详细介绍了基于Ultralytics框架和RT-DETR模型进行工业缺陷检测的完整实战流程。内容涵盖从NEU-DET数据集准备、YOLO格式转换、环境配置,到模型训练、关键参数调优、性能验证与可视化分析,最后提供了ONNX等格式的模型部署方案,为工业质检场景提供了一套高效、可落地的AI解决方案。

weixin_29168393的博客 339

Android matrix中postTranslate和preTranslate的理解

From:http://blog.sina.com.cn/s/blog_620e401d0101ahhr.html matrix.setScale(interpolatedTime, interpolatedTime);         matrix.preTranslate(-centerX, -centerY);         matrix.postTranslate(ce

MaximusKiang的专栏 2266

[Unity Demo]从零开始制作空洞骑士Hollow Knight第四集:制作更多的敌人

大家好久不见,终于放完中秋假期可以回自己家里打代码了,上一期我介绍了为什么和如何导入2D toolkit以及制作一个完整的敌人(就是那只蚊子包括了精灵,动画,状态机行为以及脚本)现在不妨趁热打铁制作更多的敌人。

dangoxiba的博客 1974

Android中关于矩阵(Matrix)前乘后乘的一些认识

android Matrix

liuqinhou的博客 400

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

对Canvas和Matrix的理解

弄明白matrix那几个方法的使用了,比如preTranslate, setTranslate, postTranslate这些。以前对它们都是一知半解,以为这几个方法没什么区别,其实还是有很大不同的,最紧要是这几个方法的调用顺序对坐标变换的影响。抽象的说pre方法是向前"生长", post方法是向后"生长",具体拿个例子来说,比如一个matrix调用了下列一系列的方法:    matr

wangshione的专栏 905

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: Collections结合Comparator实现对列表的快速排序
下一篇: 源码解析:3D推拉门式滑动菜单
潘建成
博客等级 码龄12年 139粉丝 120原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值