一、为什么加载大图片时会产生OutOfMemoryError?
这是因为Android采用图片格式是ARGB-->这里A代表透明度、R是红色、Green是绿色、Blue是蓝色。
加载图片时之所以产生的OOM是因为图片占用不存超出了系统的规范,一般我们用屏幕的分辨率比如720*1080系统分配分内存为32m,而一个图片分辨率3120*4208占用的内存为3120*4208*4=52515840即53m,这样的话系统肯定会oom
二、解决OOM:
<1>、获取屏幕的大小:
WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
//int width = wm.getDefaultDisPlay().getWidth;
//int height= wm.getDefaultDisPlay().getHeight;
Point point = new Point();
wm.getDefaultDisplay().getSize(point);
int width = point.x;
int height = point.y;
//两种区别:第二种版本14以上包括14才能使用
<2>、获取图片的大小:
//BitMapFactory.decodeFile(xx,xxx);
//第一个参数代表图片路径,第二个参数代表你设置的options
Options options = new Options();
options.inJustDecodeBounds=true;//不会把图片加到内存,但是会获取图片的信息,核心采用的是Native这里不多讲
BitMap bitmap = BitMapFactory.decodeFile(file.getAbsPath(),options);
int imgWidth = options.outWidth;
int imgHeight = options.outHeight;
<3>、计算缩放比例:
int scaleX = imgWidth/width;
int scaleY = imgHeight/height;
int scale = scaleX>scaleY?scaleX:scaleY
<4>、获取缩小后的图片:
options.inJustDecodeBounds = false;//因为之前设置了图片不能加载到内存,这里需要重新更改能加载到内存。
options.inSampleSize = scale;
BitMap bitmap = BitMapFactory.decodeFile(file.getAbsPath(),options);
<5>、显示图片:
img.setImageBitmap(bitmap);
//原来一个图片分辨率3120*4208占用的内存为3120*4208*4=52515840即53m,这样的话系统肯定会oom
bitmap.getByCount();
//现在打印出结果图片占用内存3282240/1024/720=3m,这样就能避免oom。
网友评论