package com.shz.loadimg;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView img;
private int winHeight;
private int winWidth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = (ImageView) findViewById(R.id.img);
WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);
//manager.getDefaultDisplay().getSize(outSize);
winHeight = manager.getDefaultDisplay().getHeight();
winWidth = manager.getDefaultDisplay().getWidth();
}
public void load(View view) {
// 如果图片的高为3000像素,宽为2600像素,每个像素点占4个byte(argb:透明度和颜色值)
// 则加载到内存的大小是(3000*2600*4)/(1024*1024) ≈ 30M。
// 由于Android系统分配给每个应用的堆大小为16M(小于30M),故会出现内存溢出。
// 所以以下方法肯定不行!
/*Bitmap bitmap = BitmapFactory.decodeFile("/storage/sdcard/1.jpg");
img.setImageBitmap(bitmap);*/
String imgPath = "/storage/sdcard/1.jpg";
Options opts = new Options();
// 此属性值表示不去解析加载图片到内存,只是获取图片的头部信息(宽高,备注等)
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imgPath, opts);
int imgHeight = opts.outHeight;
int imgWidth = opts.outWidth;
// 计算缩放比例(取x,y中的最大值)
int scaleX = imgWidth / winWidth;
int scaleY = imgHeight / winHeight;
int scale = 1;
if(scaleX > scaleY & scaleY >= 1)
{
scale = scaleX;
}
if(scaleY > scaleX & scaleX >= 1)
{
scale = scaleY;
}
// 现在去解析图片
opts.inJustDecodeBounds = false;
opts.inSampleSize = scale;
Bitmap bm = BitmapFactory.decodeFile(imgPath, opts);
img.setImageBitmap(bm);
}
}