欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android压缩图片Demo 博客分类: Android android图片压缩java

程序员文章站 2024-03-25 21:01:40
...
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);
		}
		
	}

}