Android(安卓)的变形矩阵 -Matrix
16lz
2021-12-04
图片色彩的变换 android 提供了 ColorMatrix. 现在图像变换android 同样提出了Matrix,这个矩阵是一个3×3的矩阵,其初始值为
的一个矩阵。
图像的变形处理通常包含以下四类基本变换:
● Translate——平移变换
● Rotate ——旋转变换
● Scale——缩放变换
● Skew——错切变换
Translate : 平移改变如下矩阵中的值
只需要改变 △x 和 △y 的值就可以实现平移
Rotate : 旋转变换
通过这个图的p0(x0,y0),我们可以列出一个公式来求出p(x,y)的坐标
写成矩阵的样子如下:
Scale: 缩放变换
一个点不存在缩放,但是一个图形矩阵,对每一个点进行等比例缩放,就出现了缩放变换。
其中k1 是x0 点的缩放比例系数
同理K2
矩阵形式如下:
Skew : 错切变换
错切变换(skew)在数学上又称为Shear mapping(剪切变换)或者Transvection(缩并),它是一种比较特殊的线性变换。错切变换的效果就是让所有点的X坐标(或者Y坐标)保持不变,而对应的Y坐标(或者X坐标)则按比例发生平移,且平移的大小和该点到X轴(或Y轴)的垂直距离成正比。
计算公式如下
x = x0 + K1 * y0;y = K2 * x0 + y0;
对应矩阵如下:
可以发现,矩阵中的a,b,c,d,e,f这六个矩阵元素分别对应以下变换:
● a和e控制Scale——缩放变换● b和d控制Skew——错切变换● c和f控制Trans——平移变换● a,b,d,e共同控制Rotate——旋转变换
将矩阵的9个值保存在一个数组
mMatri
设置给矩阵 matrix
matrix.setValues(mMatrix);
效果图
布局文件:
<?xml version="1.0" encoding="utf-8"?>
MainActivity:
package com.huawei.matrix.matrix;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.GridLayout;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { private GridLayout mGroup; private ImageView mImg; private Bitmap mbitmap; private int mEditWidth,mEditHeight; private EditText [] mEdits = new EditText[9]; // 构建9个输入框 private float[] mMatrix = new float[9]; // 矩阵数组 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImg = (ImageView) findViewById(R.id.image); mbitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher); mImg.setImageBitmap(mbitmap); mGroup = (GridLayout)findViewById(R.id.grade); mGroup.post(new Runnable() { @Override public void run() { mEditWidth = mGroup.getWidth()/3; mEditHeight = mGroup.getHeight()/3; addEdits(); initMatrix(); } }); } private void addEdits(){ for (int i=0;i<9;i++){ EditText ed = new EditText(this); mEdits[i] = ed; mGroup.addView(ed,mEditWidth,mEditHeight); } } private void initMatrix(){ for (int i=0;i<9;i++){ if (i%4==0){ mEdits[i].setText("1"); }else{ mEdits[i].setText("0"); } } } private void getMatrix(){ for (int i =0 ; i< 9 ;i++){ mMatrix[i] = Float.valueOf(mEdits[i].getText().toString()); } } private void setmImgMatrix(){ Bitmap bitmap = Bitmap.createBitmap( mbitmap.getWidth(), mbitmap.getHeight(), Bitmap.Config.ARGB_8888 ); Matrix matrix = new Matrix(); matrix.setValues(mMatrix);// matrix.setRotate(30); //旋转// matrix.setTranslate(20,20); //平移// matrix.setSkew(1.3f,1); //错切 Canvas canvas = new Canvas(bitmap); canvas.drawBitmap(mbitmap,matrix,null); mImg.setImageBitmap(bitmap); } public void btnChanged(View v){ getMatrix(); setmImgMatrix(); } public void btnReset(View v){ initMatrix(); getMatrix(); setmImgMatrix(); }}
更多相关文章
- Android(安卓)Matrix详解
- Android中图像变换Matrix的原理
- Android(安卓)Matrix
- android调用系统分享
- Android(安卓)4种补间动画基础使用。
- android前台渲染图片
- 2011.07.18(2)——— android Animation的另一种运行
- Android(安卓)获取View高度宽度
- 2011.07.18(2)——— android Animation的另一种运行