图片变换【Matrix】矩阵 简介

Matrix矩阵介绍

官方文档地址:https://developer.android.com/reference/android/graphics/Matrix.html

在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,内部就是个一维数组,内部有9个元素,可以通过setValues(float[])进行初始化,通过getValues(float[])把拿到的矩阵值赋给传入的数组。

源码中的介绍就一句话:The Matrix class holds a 3x3 matrix for transforming改变 coordinates坐标.

其具体坐标对应的属性为:

{MSCALE_X,    MSKEW_X,    MTRANS_X,

MSKEW_Y,     MSCALE_Y,   MTRANS_Y,

MPERSP_0,    MPERSP_1,    MPERSP_2}

各个值的含义为

  • MSCALE_X = 0;     X缩放
  • MSKEW_X  = 1;     X错切
  • MTRANS_X = 2;    X移动
  • MSKEW_Y  = 3;     Y错切
  • MSCALE_Y = 4;      Y缩放
  • MTRANS_Y = 5;     Y移动
  • MPERSP_0 = 6;      透视,透视就是观察的角度变化了。导致投射到平面上的二维图像变化了。
  • MPERSP_1 = 7;      透视
  • MPERSP_2 = 8;      透视

从字面上理解,矩阵中的MSCALE用于处理缩放变换,MSKEW用于处理错切变换,MTRANS用于处理平移变换,MPERSP用于处理透视变换。实际中当然不能完全按照字面上的说法去理解Matrix。同时,在Android的文档中,未见到用Matrix进行透视变换的相关说明,所以本文也不讨论这方面的问题。

在Canvas上绘制图形时既可使用Matrix,也可使用ColorMatrix来改变在Canvas对象上绘制的Paint对象。

关于错切

错切变换,在数学上又称为Shear mapping(可译为“剪切变换”)或者Transvection(缩并),它是一种比较特殊的线性变换。

错切变换的效果就是让所有点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发生平移,且平移的大小和该点到x轴(或y轴)的垂直距离成正比。错切变换,属于等面积变换,即一个形状在错切变换的前后,其面积是相等的。

下图一:各点的y坐标保持不变,但其x坐标则按比例发生了平移,这种情况叫水平错切。

下图二:各点的x坐标保持不变,但其y坐标则按比例发生了平移,这种情况叫垂直错切。

 

操作示例

获取x方向缩放比例:

matrix.getValues(matrixValues);

return matrixValues[Matrix.MSCALE_X];

移动与缩放

Matrix matrix = new Matrix();

matrix.setValues(new float[] {

1, 0, 0,

0, 1, 0,

0, 0, 1

});

x‘=1x+0y+0z(x坐标)

y‘=0x+1y+0z(y坐标)

z‘=0x+0y+1z(目前没用到)

如果第一行改为(0.5f,0,0),那么图像在x轴上将图像缩小到50%;如果第二行改为(0,2,0),那么图像在y轴上将图像放大到2倍;

如果第一行改为(1,0,100),那么图像在x轴上向右移动100像素;如果第二行改为(0,1,-100),那么图像在y轴上向上移动100像素;

常用API

高级方法详见:http://blog.csdn.net/cquwentao/article/details/51445269

构造函数

  • public Matrix():Create an identity matrix 单位矩阵
  • public Matrix(Matrix src):根据提供的矩阵创建一个新的矩阵。Create a matrix that is a (deep) copy of src

矩阵的值

  • set(Matrix src):复制。(deep) copy the src matrix into this matrix.
  • setValues(float[]):用指定的值进行初始化
  • getValues(float[]):通过把拿到的矩阵值赋给传入的数组。Copy 9 values from the matrix into the array.
  • reset:重置矩阵为单位矩阵。Set the matrix to identity
  • invert(Matrix inverse):反转、倒置。如果能反转就返回true并将反转后的值写入inverse,否则返回false。【当前矩阵*inverse=单位矩阵】

控制图片变换:

  • setTranslate(float dx,float dy):控制Matrix进行平移。右下为正
  • setSkew(float kx,float ky):控制Matrix以(0,0)为中心进行错切,kx、ky为X、Y方向上的比例
  • setRotate(float degrees):控制Matrix以(0,0)为中心进行depress角度的旋转,顺时针为正
  • setSinCos(float sinValue, float cosValue):不指定旋转角度,而是指定旋转角度对应的sin和cos值,比如,向右旋转90°时,对应的sin值为sin90°=1,对应的con值为cos90°=0。不指定中心点时的中心点为(0,0)。Set the matrix to rotate by the specified指定的 sine and cosine values, with a pivot中心点 point at (px, py).
  • setScale(float sx,float sy):设置Matrix以(0,0)为中心进行缩放,sx、sy为X、Y方向上的缩放比例。如果为负,那么会将该图像绘制到坐标系统的负值空间

说明

    • 除平移变换外,旋转变换、缩放变换和错切变换都可以围绕一个中心点来进行,如果不指定,在默认情况下是围绕(0, 0)来进行相应的变换的。
    • 以上的set方法(除了setSinCos方法),均有对应的post和pre方法。其中pre表示在队头插入一个方法(相当于矩阵中的右乘),post表示在队尾插入一个方法(相当于矩阵中的左乘),而set表示把当前队列清空,并且总是位于队列的最中间位置。
    • 当执行了一次set后,前面所有的set、pre、post都将清空,后续的pre方法总是插入到set前部的队列的最前面,post方法总是插入到set后部的队列的最后面。
    • Matrix调用一系列set、pre、post方法时,可视为将这些方法插入到一个队列,最后按照队列中从头至尾的顺序调用执行。

其他API

  • isIdentity():判断是否是单位矩阵
  • isAffine():判断是否是仿射矩阵,只要最后一行是0,0,1则是仿射矩阵。
  • rectStaysRect():判断该矩阵是否可以将一个矩形依然变换为一个矩形。当矩阵是单位矩阵,或者只进行平移,缩放,以及旋转90度的倍数的时候,返回true。Returns true if will map a rectangle to another rectangle.
  • setConcat(Matrix a, Matrix b):将当前matrix的值变为a和b的乘积。Set the matrix to the concatenation关联 of the two specified matrices and return true.

Matrix方法表

方法类别    相关API                                                         摘要

基本方法    equals hashCode toString toShortString 比较、 获取哈希值、 转换为字符串

数值操作    set reset setValues getValues 设置、 重置、 设置数值、 获取数值

设置(set)    setConcat setRotate setScale setSkew setTranslate    设置变换

前乘(pre)    preConcat preRotate preScale preSkew preTranslate    前乘变换

后乘(post)   postConcat postRotate postScale postSkew postTranslate 后乘变换

数值计算    mapPoints mapRadius mapRect mapVectors 计算变换后的数值

特殊方法    setPolyToPoly setRectToRect rectStaysRect setSinCos 一些特殊操作

矩阵相关    invert isAffine isIdentity 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 …

时间: 2024-10-05 21:59:55

图片变换【Matrix】矩阵 简介的相关文章

图片变换 矩阵 Bitmap Matrix

Matrix矩阵介绍 在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,内部就是个一维数组,内部有9个元素:可以通过setValues( float[])进行初始化,通过getValues(float[])拿到当前矩阵的值. 其具体坐标对应的属性为: {MSCALE_X,MSKEW_X,MTRANS_X,  MSKEW_Y, MSCALE_Y,MTRANS_Y,  MPERSP_0,MPERSP_1,MPERSP_2} 比如我想知道现在x方向缩放比例:

理解CSS3 transform中的Matrix(矩阵)

一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”).这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩阵)”的时候,难免会心生畏惧(即使你已经学过),正常心理.实际上,这玩意确实有点复杂. 然而,这却是屌丝逆袭的一个好机会. CSS同行间:你是不是有这样的感觉:哎呀呀,每天就是对着设计图切页面,貌似技术没有得到实质性地提升啊,或者觉得日后高度有限! 我们应该都知道二八法则(巴莱多定律),即任何一组东西中

css3 transform中的matrix矩阵

CSS3中的矩阵CSS3中的矩阵指的是一个方法,书写为matrix()和matrix3d(),前者是元素2D平面的移动变换(transform),后者则是3D变换.2D变换矩阵为3*3, 如上面矩阵示意图:3D变换则是4*4的矩阵. 有些迷糊?恩,我也觉得上面讲述有些不合时宜.那好,我们先看看其他东西,层层渐进——transform属性. 具体关于transform属性具体内容可以点击这里补个课.稍微熟悉的人都知道,transform中有这么几个属性方法: .trans_skew { trans

[Android] 使用Matrix矩阵类对图像进行缩放、旋转、对比度、亮度处理

    前一篇文章讲述了Android拍照.截图.保存并显示在ImageView控件中,该篇文章继续讲述Android图像处理技术,主要操作包括:通过打开相册里的图片,使用Matrix对图像进行缩放.旋转.移动.对比度.亮度.饱和度操作,希望对大家有所帮助. 一. 显示打开图片     首先,设置activity_main.xml布局如下所示: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android

Android Matrix矩阵详解

Android中有两个比较重要的矩阵,ColorMatrix和Matrix.ColorMatrix用来改变bitmap的颜色和透明度,Matrix用来对bitmap平移.缩放.错切. ColorMatrix(色彩矩阵) Android中Bitmap色彩用了一个[R, G, B, A],4*1的矩阵来保存. 如果想改变一个Bitmap的色彩该怎么办?现在来了解下ColorMatrix的相关知识.ColorMatrix 是一个4*5的矩阵. 我们用[R', G', B', A']来保存新的bitma

[ css 矩阵 Matrix 属性 ] css中transform的Matrix(矩阵)属性讲解及实例演示的区别

一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”).这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩阵)”的时候,难免会心生畏惧(即使你已经学过),正常心理.实际上,这玩意确实有点复杂. 然而,这却是屌丝逆袭的一个好机会. CSS同行间:你是不是有这样的感觉:哎呀呀,每天就是对着设计图切页面,貌似技术没有得到实质性地提升啊,或者觉得日后高度有限! 我们应该都知道二八法则(巴莱多定律),即任何一组东西中

理解CSS3 transform中的Matrix(矩阵)——张鑫旭

by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2427 一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”).这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩阵)”的时候,难免会心生畏惧(即使你已经学过),正常心理.实际上,这玩意确实有点复杂. 然而,这却是屌丝逆袭的一个好机

matrix矩阵

matrix(a,b,c,d,e,f) x’        | a c e  |     x y’    =  | b d f  |     y 1        |  0 0 1  |    1 这就是矩阵的运算了,简化为公式:x’=ax+cy+ey’=bx+dy+f css3的transform属性很好用,其实可以变换为matrix矩阵工作,只需要给abcdef附上相应的值就可以了. 比如translate(tx,ty)可以由matrix(1,0,0,1,tx,ty)转换而来,计算方法见公式

UVA 11149 - Power of Matrix(矩阵倍增)

UVA 11149 - Power of Matrix 题目链接 题意:给定一个n*n的矩阵A和k,求∑kiAi 思路:利用倍增去搞,∑kiAi=(1+Ak/2)∑k/2iAi,不断二分即可 代码: #include <cstdio> #include <cstring> const int N = 45; int n, k; struct mat { int v[N][N]; mat() {memset(v, 0, sizeof(v));} mat operator * (mat