在实际中,有些时候我们需要从SD卡中加载一张很大的图片到内存中,但是如果你手机存储很小的话,如果直接将这张大图片放入内容就会导致分配失败等异常问题。所以我们就需要一种手段,将大图片也能正常的加载到内存,而不出现异常的情况。
那如何才能将大图片加载到内存中,而不出现内存溢出?
Android系统提供了一个方法,通过显示比例加载图片,这样就会返回比原图更小的图片。
1: 先要获取该图片的参数情况,Android系统提供了一个BitmapFactory这个类
可以创建一个Bitmap对象,从不同的源可以获取图片资源。
BitmapFactory.decodeResource(res, id)
用如上的代码就能获得一个Bitmap对象。BitmapFactory.decodeResource方法的第二个参数就能获取到图片的各项参数
BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);
2: Options是一个类, 里面封装了图片的各项参数
/*inJustDecodeBounds等于true: 代表的是将返回的是null,不是bitmap的对象,但是却能得到源文件的参数情况*/
opts.inJustDecodeBounds = true;
3:获取屏幕的宽和高
//获取屏幕的宽和高
Display dp = getWindowManager().getDefaultDisplay();
int screenWidth = dp.getWidth();
int screenHeight = dp.getHeight();
4:计算缩放比例:
/*计算图片的缩放比例*/
int scale = 1;
int scaleWidth = imageWidth / screenWidth;
int scaleheight = imageHeight / screenHeight;
if(scaleWidth >= scaleheight && scaleWidth >= 1)
{
scale = scaleWidth;
}
else if (scaleheight > scaleWidth && scaleheight >= 1) {
scale = scaleheight;
}
5: 再获取Bitmap对象,以比例的方式去获取
/*设置图片的缩放比例*/
opts.inSampleSize = scale;/*如果大于1, 请求解码器去对原图取样,返回一个更小的image*/
opts.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);
/*显示图片*/
ImageView iView = (ImageView) findViewById(R.id.iv);
iView.setImageBitmap(bitmap);
整个代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Log.i("MainActivity", "onclick");
/*先解析这张很大图片,得到图片参数情况*/
Options opts = new Options();
/*inJustDecodeBounds等于true: 代表的是将返回的是null,不是bitmap的对象,但是却能得到源文件的参数情况*/
opts.inJustDecodeBounds = true;
//BitMapFactory这个类是创建一个bitmap对象,是通过不同的源
BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);
//获取到图片的宽和高
int imageWidth = opts.outWidth;
int imageHeight = opts.outHeight;
//获取屏幕的宽和高
Display dp = getWindowManager().getDefaultDisplay();
int screenWidth = dp.getWidth();
int screenHeight = dp.getHeight();
/*计算图片的缩放比例*/
int scale = 1;
int scaleWidth = imageWidth / screenWidth;
int scaleheight = imageHeight / screenHeight;
if(scaleWidth >= scaleheight && scaleWidth >= 1)
{
scale = scaleWidth;
}
else if (scaleheight > scaleWidth && scaleheight >= 1) {
scale = scaleheight;
}
/*设置图片的缩放比例*/
opts.inSampleSize = scale;/*如果大于1, 请求解码器去对原图取样,返回一个更小的image*/
opts.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);
/*显示图片*/
ImageView iView = (ImageView) findViewById(R.id.iv);
iView.setImageBitmap(bitmap);
}
});
}
}
效果图: