加载图片产生的OOM

一、为什么加载大图片时会产生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。

你可能感兴趣的:(加载图片产生的OOM)