首页 文章 精选 留言 我的

精选列表

搜索[android things],共10000篇文章
优秀的个人博客,低调大师

Android——Matrix变换矩阵的探索(1)

个人博客CoorChice,https://chenbingx.github.io/ ,最新文章将会首发CoorChice的博客,欢迎探索哦 ! 同时,搜索微信公众号CoorChice,或扫描文章末尾二维码,可以关注我的微信公众号。同期文章也将会优先推送到微信公众号中,以提醒您有新鲜文章出炉。 本文是从个人学习过程中所记录的笔记中经过再次整理而得,所有观点仅代表个人理解,如有错误,还望指出。 矩阵的基本原理 标准矩阵 标准矩阵又称为对角矩阵,它的形式如下: 1, 0, 0 0, 1, 0 0, 0, 1 矩阵的运算原理 矩阵的简单运算规则:左矩阵的一行的每个值,分别按顺序一一对应的乘上右矩阵的一列的值。也就是说,运算的左右两个矩阵必须符合左矩阵的列数要等于右矩阵的行数,否则两个矩阵就不能进行运算。下面给出两个例子: 例1 例2 可以看出,由于矩阵乘法的特殊性,所以它是不支持交换律的。不理解的同学可以找线性代数的书看看,这里就不再赘述了。 认识Matrix变换矩阵 Matrix变换矩阵包含了4种基本变换:缩放、错切(Skew)、平移、旋转。 我们先来看看Matrix这个3*3的矩阵结构: Matrix矩阵结构 其实都是顾名思义的: MSCALE_X和MSCALE_Y控制着缩放变换 MSKEW_X和MSKEW_Y控制着错切变换 MTRANS_X和MTRANS_Y控制着平移变换 MSCALE_X、MSCALE_Y和MSKEW_X、MSKEW_Y共同控制着旋转变换 最后3个值MPERSP_0、MPERSP_1、MPERSP_2控制着透视变换 Matrix的具体使用 改变一个Matrix 通过调用new Matrix 所获得矩阵是一个标准矩阵,我们可以用两种方式变换它: 通过setValue()方法给它设置一个大小为9的float[],这种方式每次都会覆盖掉矩阵的原有值。 float[] floats = new float[9]; //创建一个一维数组 Matrix matrix = new Matrix(); //创建一个变换矩阵对象 matrix.setValues(floats); //将一维数组转化为变换矩阵 canvas.drawBitmap(bitmap,matrix,null); //达到变换图片的效果 通过系统封装好的方法来进行变换: set\pre\postScale() —— 进行缩放变换; set\pre\postSkew() —— 进行错切变换; set\pre\postTranslate() —— 进行平移变换; set\pre\postRotate() —— 进行旋转变换。 setXXX()、preXXX()、postXXX()区别 区别一:矩阵的连接顺序 setXXX()是直接覆盖掉原矩阵,或者说先把原矩阵刷新成标准矩阵,然后在运算。所以,如果参数为null的话,意味着不发生变换,即得到一个标准矩阵。 preXXX()是前乘运算,即把矩阵乘在前面。 postXXX()是后乘运算,即把矩阵乘在后面。 误区一:pre先执行,并且是顺序执行;post后执行,并且是逆序执行 首先,正常情况下,程序是会按照代码的顺序执行的。其次,虽然矩阵乘法不支持交换律,但是支持** (T1 * T2) * T3 = T1 * (T2 * T3) ** 这样的运算。就是说矩阵乘法先乘和后乘是一样的。 所以,很多地方这样说是错误的。 使用Matrix变换图片一般做法 调用drawBitmap(mBitmap,mMatrix,mPaint)来直接改变Bitmap的绘制。 调用mImageView.setImageMatrix(mMatrix)来改变ImageView中的图片。 CoorChice的公众号

优秀的个人博客,低调大师

Android——Matrix变换矩阵的探索(2)

个人博客CoorChice,https://chenbingx.github.io/ ,最新文章将会首发CoorChice的博客,欢迎探索哦 ! 同时,搜索微信公众号CoorChice,或扫描文章末尾二维码,可以关注我的微信公众号。同期文章也将会优先推送到微信公众号中,以提醒您有新鲜文章出炉。 前面我已经大概的介绍了一下Matrix矩阵,下面我们来看一下 xxxScale(), xxxSkew(), xxxTranslate(), xxxRotate() 的计算过程: 首先我们需要先明确矩阵是如何改变坐标点的 对于一个坐标为 (X_0,Y_0) 的点,我希望把他变成 (kx_0,ky_0), 那么我们可以给它乘上一个矩阵: (X_0,Y_0)->(kx_0,ky_0) 这样,我们就把这个点成功的进行了变换。 那么矩阵是如何对图片进行变换的呢? 其实很简单,它只不过是对图片的每个像素点进行了变换,组成图片的所有像素点都变了,那么图片自然也就变了。 这样说的话,那缩放变换感觉很诡异啊,一个像素点还能变大变小吗? 图片的缩放原理相对复杂一些,但其实它就是按照一定的算法,对图片进行下采样(缩小)、上采样(放大)来对图片进行变换的。 所谓 下采样,就是按照一定的规律,在原图的所有像素点中,截取符合规律的像素点(这意味着一些像素点会被丢弃掉),然后将这些像素点呈现出来,我们就可以看到一张缩小了得图片。 所谓 上采样,就是按照一定的算法,在原图片的额像素群中插入一些像素点,然后再把这些像素点呈现出来,就得到一张放大的图片。 当然这个复杂的计算过程不需要我们自己去实现,我们只需要告诉系统,我要一张多大的图片,系统就会帮助我们完成这个过程,然后直接给我们一张处理好的图片。 缩放变换xxxScale() 前面我们已经知道了Scale变换是由MSACLE_X,和MSCALE_Y控制的,那么自然的,xxxScale()就是通过修改这两个值到达变换矩阵目的。注:下面的讲解都基于一个标准矩阵 A 来进行。 setScale() 调用 setScale(k_1,k_2) ,则是直接把A矩阵设置为: setScale(k_1,k_2) 再次说明,调用 setXXX()是直接设置矩阵的值,不管你此前对矩阵做了什么操作,它都会被这个矩阵给覆盖掉。 preScale() 调用 preScale(k_1,k_2) ,则是经过如下计算: preScale(k_1,k_2) postScale() postScale(k_1,k_2) 是后乘,它的计算过程如下: postScale(k_1,k_2) 错切变换xxxSkew() setSkew() 调用 setSkew(k_1,k_2) ,直接将A设置成: setSkew(k_1,k_2) preSkew() 调用 preSkew(k_1,k_2) 的计算过程如下: preSkew(k_1,k_2) postSkew() 调用 postSkew(k_1,k_2) 的计算过程如下: postSkew(k_1,k_2) 平移变换xxxTranslate() setTranslate() 调用 setTranslate() 是将矩阵直接设置为: setTranslate() preTranslate()和postTranslate()的计算原理和上述的一样的。 缩放变换xxxRotate() setRotate() 调用setRotate(a)会直接把矩阵设置为: setRotate(a) preRotate()和postRotate()的计算过程就不在赘述了。 CoorChice的公众号

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册