android压缩图片Demo

1、环境
  在手机SD卡上有一张图片,图上相对较大,如果直接用读取文件的方式将图片读取出来有可能会出现内存益处,这里就必须要将图片压缩读取才能保证不出现内存益处错误
2、代码中需要用到的类方法及其主要作用
  2.1 Environment:主要是用于获取SD卡的路径信息
  2.2 AsyncTask:异步任务,用于耗时操作实现异步功能
  2.3 doInBackground(),AsyncTask子类的实现方法,该方法运行在工作线程上,主要用于执行一些耗时操作。
  2.4 onPostExecute() AsyncTask子类的实现方法,该方法运行在主线程上,主要用于更新UI操作。
  2.5 Options 通过此类封装一些压缩的配置信息
  2.6 opts.inJustDecodeBounds 通过该属性的设置BitmapFactory.decodeFile()只读取图片的边界信息(长和宽并将读取到的边界信息存入Options对象中 
  2.7 BitmapFactory 读取图片信息封装类
  2.8 DisplayMetrics 获取屏幕信息


3.代码实现
package com.example.compressedimage;

import java.io.File;

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.util.DisplayMetrics;
import android.widget.ImageView;

public class MainActivity extends Activity {

	private ImageView iv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		iv = (ImageView) findViewById(R.id.imageView1);
		
		/**取得SD卡存储图片的路径*/
		File fileDir = Environment
				.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
		
		/**创建图片文件*/
		File file = new File(fileDir, "wf.jpg");
		
		ImageTask iTask = new ImageTask();
		/**从线程池THREAD_POOL_EXECUTOR获取线程执行异步操作*/
		iTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, file);

	}
	
	/**
	 * 图片读取异步类,用于压缩图片及将图片更新到UI上
	 * @author Leiht
	 */
	class ImageTask extends AsyncTask<File, Void, Bitmap> {
		
		/**此方法运行在工作线程上,通常用于执行耗时的操作(如读取较大的图片音乐文件等*/
		@Override
		protected Bitmap doInBackground(File... params) {
			/**通过此类封装一些压缩的配置信息*/
			Options opts = new Options();
			/**通过该属性的设置使BitmapFactory.decodeFile()只读取图片的边界信息(长和宽
			 * 并将读取到的边界信息存入Options对象中*/
			opts.inJustDecodeBounds = true;
			
			/**开始读取指定图片的边界信息*/
			BitmapFactory.decodeFile(params[0].getPath(), opts);
			
			/**获取图片的边界信息*/
			int weight = opts.outWidth;
			int height = opts.outHeight;
			/**获取屏幕信息*/
			DisplayMetrics dm = new DisplayMetrics();
			/**将window窗口的显示信息封装到DisplayMetrics对象*/
			getWindowManager().getDefaultDisplay().getMetrics(dm);
			
			/**节能屏幕的宽度和高度(以象素为单位)*/
			int dp = dm.widthPixels;
			int hp = dm.heightPixels;
			
			/**设置压缩比例,压缩比例算法自己确定*/
			int x = weight/dp;
			int y = height/hp;
			if(x >= y && x > 1) {
				opts.inSampleSize = x;
			}else if(y > x && y > 1) {
				opts.inSampleSize = y;
			}else {
				//默认取8
				opts.inSampleSize = 8;
			}
			
			/**通过该属性的设置使BitmapFactory.decodeFile()以字节的方式读取图片*/
			opts.inJustDecodeBounds = false;
			
			Bitmap bitmap = BitmapFactory.decodeFile(params[0].getPath(), opts);
			
			return bitmap;
		}
		
		/**
		 * 此方法在主线程中执行,用于更新UI界面
		 */
		@Override
		protected void onPostExecute(Bitmap result) {
			/**显示图片到ImageView*/
			iv.setImageBitmap(result);
		}
		
	}

}

猜你喜欢

转载自leihongtai2010.iteye.com/blog/2258301