图片色彩的变换 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();    }}











更多相关文章

  1. Android(安卓)Matrix详解
  2. Android中图像变换Matrix的原理
  3. Android(安卓)Matrix
  4. android调用系统分享
  5. Android(安卓)4种补间动画基础使用。
  6. android前台渲染图片
  7. 2011.07.18(2)——— android Animation的另一种运行
  8. Android(安卓)获取View高度宽度
  9. 2011.07.18(2)——— android Animation的另一种运行

随机推荐

  1. Android(安卓)roboguice 开源框架使用
  2. Android(安卓)如何通过menu id来得到menu
  3. Android(安卓)studio Robotium环境搭建-
  4. ApiDemos之ActionBarTab
  5. 初涉android中的回调机制
  6. Android(安卓)开机图片/文字/动画 修改
  7. Android(安卓)异步加载图片-AsyncTask
  8. Android(安卓)APK系列3-------使用platfo
  9. 【android】使用CursorAdapter注意事项
  10. Android(安卓)碎碎记