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);
}
}
}