图片色彩的变换 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"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.huawei.matrix.matrix.MainActivity">
<ImageView
android:id="@+id/image"
android:layout_weight="2"
android:layout_width="match_parent"
android:layout_height="0dp" />
<GridLayout
android:id="@+id/grade"
android:layout_weight="3"
android:columnCount="3"
android:rowCount="3"
android:layout_width="match_parent"
android:layout_height="0dp">
</GridLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="btnChanged"
android:text="changed"
android:layout_height="wrap_content" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="btnReset"
android:text="reset"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
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();
}
}