加载大图片引发的OOM问题

在解析图片时可能会遇到的OOM问题,通常我们可以通过BitmapFactory的decodeXXX方法解析出一张Bitmap,假如图片很小的话,不会有什么问题,但是图片很大的话,就可能会导致OOM问题,这个时候我们往往要通过BitmapFactory中的Options去压缩图片

既然是要压缩图片,压缩的比例是多大??
1.计算出屏幕的width,height
- WindowManager manager = (WindowManager)getSystemService(WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
Point outSize = new Point();
display.getSize(outSize);
x = outSize.x;
y = outSize.y; -
2.计算出图片的实际的width,height,必须要有opts.inJustDecodeBounds = true; 加上了这句代码,就只会返回图片的基本信息(比如图片的width,height等等)并不会返回实际的bitmap,也不会为了他去分配内存空间,所以就不会有OOM的问题

  •   BitmapFactory.Options opts = new BitmapFactory.Options();
      opts.inJustDecodeBounds = true;
      Bitmap bitmap = BitmapFactory.decodeFile(path,opts);
      int outWidth = opts.outWidth;
      int outHeight = opts.outHeight; -
    

3.设置默认的压缩比 scale == 1
当scale > 1时,比如scale==2时,BitmapFactory就会解析出一张原始图片的子样本,子样本的width和height都是原来的 1/2,也就是说子样本是原始图片的1/4

当scale <= 1时,可以吧scale设置为1

4.计算出适合的压缩比:
- int scale = 1;
int scaleX = outWidth / x;
int scaleY = outHeight / y;
if (scaleX > scaleY && scaleX > 1) {
scale = scaleX;
}
if (scaleX <= scaleY && scaleY > 1) {
scale = scaleY;
} -
5.设置缩放:
opts.inSampleSize = scale;
opts.inJustDecodeBounds = false;(必须要这句代码,才能返回一张bitmap)
Bitmap bitmap = BitmapFactory.decodeFile(path,opts);
就这样得到了一张缩略图,需要注意的是不管这里还是在前面获取图片基本信息的时候,如果路径错了,那么实际返回的bitmap位null

  • public class MainActivity extends AppCompatActivity {
    String path = Environment.getExternalStorageDirectory() + "/dog.jpg";
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path,opts);
    int outWidth = opts.outWidth;
    int outHeight = opts.outHeight;
    int scale = 1;
    int scaleX = outWidth / x;
    int scaleY = outHeight / y;
    if (scaleX > scaleY && scaleX > 1) {
    scale = scaleX;
    }

     if (scaleX <= scaleY && scaleY > 1) {
         scale = scaleY;
     }
    
     // 设置缩放
     opts.inSampleSize = scale;
     opts.inJustDecodeBounds = false;
     Bitmap bitmap = BitmapFactory.decodeFile(path,opts);
    
     iv.setImageBitmap(bitmap);
    

你可能感兴趣的:(加载大图片引发的OOM问题)