直接加载大图片到程序中,会导致程序崩溃,因为一般情况下,一个应用程序系统分配的内存只有16M,超过了16M,程序就要挂了。
所以加载图片的时候,应该先获取图片的信息(宽高),在根据手机屏幕的宽高,对图片进行缩放,再加载到内存。
主要代码:
package com.example.loadImg;
import java.io.IOException;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.media.ExifInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
import android.os.Build;
public class MainActivity extends Activity {
ImageView iv;
int windowWidth,windowHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.img);
windowWidth = getWindowManager().getDefaultDisplay().getWidth();
windowHeight = getWindowManager().getDefaultDisplay().getHeight();
}
public void load(View view){
//如果加载大分辨率图片,程序会崩溃
// Bitmap bit = BitmapFactory.decodeFile("/sdcard/a.png");
// iv.setImageBitmap(bit);
//图片解析配置
Options opts = new Options();
//不真实加载图片到内存,只加载图片的详情信息
opts.inJustDecodeBounds = true;
Bitmap bit = BitmapFactory.decodeFile("/sdcard/a.png", opts);
//计算图片缩放比例
int imgWidth = opts.outWidth;
int imgHeight = opts.outHeight;
int scaleX = imgWidth / windowWidth;
int scaleY = imgHeight / windowHeight;
int scale = 1;
if(scaleX > scaleY & scaleY >= 1){
scale = scaleX;
}else if(scaleX < scaleY & scaleX >= 1){
scale = scaleY;
}
//设置加载图片
opts.inJustDecodeBounds = false;
//设置采样率
opts.inSampleSize = scale;
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/a.png", opts);
iv.setImageBitmap(bitmap);
}
public void load1(View view){
try {
ExifInterface exif = new ExifInterface("/sdcard/a.png");
String time = exif.getAttribute(ExifInterface.TAG_DATETIME);
String model = exif.getAttribute(ExifInterface.TAG_MODEL);
System.out.println(time);
Toast.makeText(this, model, 0).show();
//exif.setAttribute(tag, value);可以修改文件的信息
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}