Android-使用Matrix对Bitmap进行处理

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

Android-使用Matrix对Bitmap进行处理,码迷,mamicode.com

时间: 2024-10-16 04:15:24

Android-使用Matrix对Bitmap进行处理的相关文章

Android两种旋转Bitmap方法比较

方法1. 利用Bitmap.createBitmap Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) { Matrix m = new Matrix(); m.setRotate(orientationDegree, ( float ) bm.getWidth() / 2, ( float ) bm.getHeight() / 2); try { Bitmap bm1 = Bitmap.createBitmap

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

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

Android中Matrix开发汇总

开发中遇到一些涉及到Matrix的地方,现在此归纳,便于日后查阅. 通过对ImageView设置Matrix来实现ImageView中图片的单指拖动和两指缩放 核心方法: imageView.setImageMatrix(matrix); 所以我们的重点在于去操作一个Matrix. 该处主要用到的是利用Matrix实现缩放(Scale)和位移(Translate) Android图片旋转,缩放,位移,倾斜,对称完整示例(一)--imageView.setImageMatrix(matrix)和M

Android中常用的bitmap处理方法

收集了很多bitmap相关的处理方法,几乎全部应用在项目中,所以特记录下! package com.tmacsky.utils; import java.io.ByteArrayOutputStream; import java.io.IOException; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.gr

android: android 中的Matrix (android.graphics.Matrix) (转)

本篇博客主要讲解一下如何处理对一个Bitmap对象进行处理,包括:缩放.旋转.位移.倾斜等.在最后将以一个简单的Demo来演示图片特效的变换. 1. Matrix概述 对于一个图片变换的处理,需要Matrix类的支持,它位于"android.graphics.Matrix"包下,是Android提供的一个3*3 矩阵工具类: 它本身不能对图像或View进行变换,但它可与其他API结合来控制图形.View的变换,如Canvas.Matrix提供了一些方法来控制图片变换: setTrans

android.graphics.Matrix

Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来初始化它里边的内容,所以创建实例后需要调用reset()方法生成一个标准matrix,或者调用set..一类的函数,比如setTranslate, setRotate,,该函数将会决定matrix如何来改变坐标.SDK里边没有讲述Matrix的3x3矩阵是如何改变点的坐标值的,但是我在代码里边通过打印那9个点的值时,大致可以得到如下结论,9个值[a,b,c,d,e,f,g,h,i],坐标[x,y],当g=0,h=0,i=1,的时

android:scaleType=&quot;matrix&quot;布局文件加载图片时候的显示方式

android:scaleType="center" 以原图的几何中心点和ImagView的几何中心点为基准,按图片的原来size居中显示,不缩放,当图片长/宽超过View的长/宽,则截取图片的居中部分显示ImageView的size.当图片小于View 的长宽时,只显示图片的size,不剪裁. android:scaleType="centerCrop" 以原图的几何中心点和ImagView的几何中心点为基准,按比例扩大(图片小于View的宽时)图片的size居中

Android 一张图片(BitMap)占用内存的计算 图片内存优化

在Android开发中,我现在发现很多人还不会对图片占用内存进行很好的计算. 因此撰写该博文来做介绍,期望达到抛砖引玉的作用. Android中一张图片(BitMap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数. 一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数 注:图片长度和图片宽度的单位是像素. 图片(BitMap)占用的内存应该和屏幕密度(Density)无关,虽然我暂时还拿不出直接证据. 创建一个BitMap时,其单位像素占用的

Android有效的处理Bitmap,减少内存

Android有效的处理Bitmap,减少内存 图片可能会有不同的大小.在许多情况下,图片的大小会超出我们需要的大小.例如,我们的Camera应用,我们所拍的照片的大小远大于屏幕显示的大小 假如你的应用被限制了内存使用,显而易见,你会选择加载一个低分辨率的图片.这张低分辨率的图片应该匹配屏幕的尺寸.更高分辨率的图像没有提供任何可见的好处,但仍占用宝贵的内存,而且由于额外的动态缩放,会带来额外的性能开销. 本篇文章教你通过加载一个小尺寸的图片样本,来修饰一张大图,并且没有超过应用的内存限制. 原文