因为手机的内存限制,在app中可使用的内存是受限的。如果显示一幅高分辨率照片时不注意方法,很有可能会引起内存溢出而导致app挂掉或者图片显示不出来。
ImageView支持的图片大小也是有限制的,我在开发过程中发现的警告信息是4096*4096,大了就显示不出来,这种情况要如何解决呢,我采取方法是按比例缩小图片,这是一种既能完美显示、又节省内存的方法:
BitmapFactory.Options这个类,有一个叫做 inJustDecodeBounds 成员变量,看SDK中的说明,把它设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap,但它会把它的height、width等基本信息取回来放到Options里,这样就不会实际分配图片所需的内存,之后我们根据Options的里内容和你想限制的大小来确定要缩放到哪种比例。
实现缩放要用到Options里的成员 inSampleSize,实际缩放的大小=原大小 / inSampleSize,一般手机拍的照片,把它的值设成4来显示和原图基本是没有任何差别的,下面来看例子:
//获取图片大小,确定是否要缩小到合适尺寸 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(srcFile, options); //计算缩放比例, 限制不超过1920*1280 int sacle = calculateInSampleSize(options, 1920, 1280); options = new BitmapFactory.Options(); options.inJustDecodeBounds = false;//这块要取实际的Bitmap了,用false options.inSampleSize = sacle;//设置缩放比例 return BitmapFactory.decodeFile(srcFile, options);//返回缩放后的图片
计算缩放比例的代码:
private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // reqWidth、reqHeight是想要显示图片的大小 final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { inSampleSize *= 2; while ((height / inSampleSize) > reqHeight && (width / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; }