Android-採用Matrix對Bitmap加工

weixin_34162629發表於2015-09-12

1.Android正在使用Matrix放、旋轉、平移、斜切等變換的。

Matrix是一個3*3的矩陣,其值相應例如以下:

以下給出詳細座標相應變形的屬性
|scaleX, skewX, translateX| 
|skewY, scaleY, translateY|
|0       ,0        , scale       |

Matrix提供了一些方法來控制圖片變換:
setTranslate(float dx,float dy):控制Matrix進行位移。
setSkew(float kx,float ky):控制Matrix進行傾斜,kx、ky為X、Y方向上的比例。
setSkew(float kx,float ky,float px,float py):控制Matrix以px、py為軸心進行傾斜,kx、ky為X、Y方向上的傾斜比例。
setRotate(float degrees):控制Matrix進行depress角度的旋轉,軸心為(0,0)。
setRotate(float degrees,float px,float py):控制Matrix進行depress角度的旋轉。軸心為(px,py)。


setScale(float sx,float sy):設定Matrix進行縮放,sx、sy為X、Y方向上的縮放比例。
setScale(float sx,float sy,float px,float py):設定Matrix以(px,py)為軸心進行縮放,sx、sy為X、Y方向上的縮放比例。
注意:以上的set方法,均有相應的post和pre方法,Matrix呼叫一系列set,pre,post方法時,可視為將這些方法插入到一個佇列.當然,依照佇列中從頭至尾的順序呼叫執行.當中pre表示在隊頭插入一個方法,post表示在隊尾插入一個方法.而set表示把當前佇列清空,而且總是位於佇列的最中間位置.當執行了一次set後:pre方法總是插入到set前部的佇列的最前面,post方法總是插入到set後部的佇列的最後面

Demo

package com.example.testaa;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

	@ViewById
	ImageView iv1;

	@ViewById
	ImageView iv2;

	@ViewById
	Button btn1;

	@ViewById
	Button btn2;

	@ViewById
	Button btn3;

	@ViewById
	Button btn4;

	@ViewById
	Button btn5;

	Bitmap bitmap = null;

	/**
	 * 載入完View之後進行的處理
	 */
	@AfterViews
	void afterViewProcess() {
		bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lena);

	}

	/**
	 * 縮小
	 */
	@Click
	void btn1() {
		Matrix matrix = new Matrix();
		matrix.setScale(0.5f, 0.5f);
		Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
				bitmap.getHeight(), matrix, true);
		iv2.setImageBitmap(bm);
		showToast(matrix);
	}

    /**
     * 先縮小後旋轉
     */
	@Click
	void btn2() {
		Matrix matrix = new Matrix();
		matrix.setScale(0.5f, 0.5f);// 縮小為原來的一半
		matrix.postRotate(45.0f);// 旋轉45度 == matrix.setSinCos(0.5f, 0.5f);
		Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
				bitmap.getHeight(), matrix, true);
		iv2.setImageBitmap(bm);
		showToast(matrix);
	}

	/**
	 * 平移
	 */
	@Click
	void btn3() {
		Matrix matrix = new Matrix();
		matrix.setTranslate(bitmap.getWidth() / 2, bitmap.getHeight() / 2);// 向左下平移
		Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
				bitmap.getHeight(), matrix, true);
		iv2.setImageBitmap(bm);
		showToast(matrix);
	}

	/**
	 * 斜切
	 */
	@Click
	void btn4() {
		Matrix matrix = new Matrix();
		matrix.setSkew(0.5f, 0.5f);// 斜切
		matrix.postScale(0.5f, 0.5f);// 縮小為原來的一半
		Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
				bitmap.getHeight(), matrix, true);
		iv2.setImageBitmap(bm);
		showToast(matrix);
	}

	/**
	 * 相當於自由變換
	 * 由一個矩形變成四邊形
	 */
	@Click
	void btn5() {
		Matrix matrix = new Matrix();
		float[] src = new float[] { 0, 0, // 左上
				bitmap.getWidth(), 0,// 右上
				bitmap.getWidth(), bitmap.getHeight(),// 右下
				0, bitmap.getHeight() };// 左下
		float[] dst = new float[] { 0, 0, 
				bitmap.getWidth(), 30,
				bitmap.getWidth(), bitmap.getHeight() - 30,
				0,bitmap.getHeight() };
		matrix.setPolyToPoly(src, 0, dst, 0, src.length/2);
		Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
				bitmap.getHeight(), matrix, true);
		iv2.setImageBitmap(bm);
		showToast(matrix);
	}

	/**
	 * 顯示矩陣中的值
	 * @param matrix
	 */
	@UiThread
	void showToast(Matrix matrix) {
		String string = "";
		float[] values = new float[9];
		matrix.getValues(values);
		for (int i = 0; i < values.length; i++) {
			string += "matrix.at" + i + "=" + values[i];
		}
		Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
		Log.d("TEST", string);
	}
}


以下是分別對影象進行例如以下操作的結果:



整個專案的下載地址:http://download.csdn.net/detail/nuptboyzhb/7261933


版權宣告:本文博主原創文章。部落格,未經同意不得轉載。

相關文章