先看错误吧:
Out of memory on a 122880016-byte allocation.
04-06 22:53:13.992 16692-16692/com.cxx.loadbigimg E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.cxx.loadbigimg, PID: 16692
java.lang.OutOfMemoryError
在这要做一个普及就是图片的大小并不是我们看到的图片具体有多大如2.2M,它的计算公式是:图片的总像素*每个像素的大小。在Android上采用ARGB的方式表示颜色每个像素占4byte。
在这个项目中我们可以看到应用程序申请了122880016byte大小的空间等于117M的大小所以导致内存溢出,那我们的做法就是采用压缩来解决主要可以分为如下几个步骤:
- 获取手机分辨率
- 创建图片工厂的配置参数
- 设置属性不去真正解析Bitmap返回一个null,能得到图片的宽和高
- 通过设置的属性加载Bitmap
- 得到图片的宽和高
- 计算缩放比
- 按照缩放比显示
- 真正解析图片
//1.获取手机分辨率
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
int width = windowManager.getDefaultDisplay().getWidth();
int height = windowManager.getDefaultDisplay().getHeight();
//2.创建图片工厂的配置参数
BitmapFactory.Options options = new BitmapFactory.Options();
//3.设置属性不去真正解析Bitmap返回一个null,能得到图片的宽和高
// options.inJustDecodeBounds = true;
//4.通过设置的属性加载Bitmap
BitmapFactory.decodeResource(getResources(), R.drawable.dog, options);
//5.得到图片的宽和高
int outWidth = options.outWidth;
int outHeight = options.outHeight;
//6.计算缩放比
int mscare = 1;
int scareX = outWidth / width;
int scareY = outHeight / height;
int min = Math.min(scareX, scareY);
if (min > 1) {
mscare = min;
}
//7.按照缩放比显示
options.inSampleSize = mscare;
//8.真正解析图片
options.inJustDecodeBounds = false;
Bitmap scareBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog, options);
img.setImageBitmap(scareBitmap);
总共分为这八步就可以实现图片的压缩了。
源码地址:
源码地址