此文 可以处理低端设备加载图片,还可以优化图片的加载 从而提高app的工作效率 最终提高用户的舒适度
加载bitmap 当设备的堆栈内存较小而且bitmap.jpg较大的时候,用下面的代码内存溢出。
Bitmap bp=BitmapFactory.decodeFile("sdcard/bitmap.jpg"); ImageView imageView=(ImageView) findViewById(R.id.imageView1); imageView.setImageBitmap(bp);
|
测试时的信息:设备内存是16M 图片1.73M。
此时LogCat信息:
我们会发现是内存溢出了,可下面的代码似乎没有任何问题,其实的确没有任何问题。
Bitmap bp=BitmapFactory.decodeFile("sdcard/bitmap.jpg"); ImageView imageView=(ImageView) |
最主要的提示信息其实在(LogCat)上面,内容如下:
内存溢出的原因是:
30720012 byte=29 M
也就是说图片加载申请了29M的内存远大于设备的16M内存
解析:
29M是计算机把所有的像素信息(像素个数*像素占用空间大小*4+其他信息)解析出来的保存至内存的大小(4是因为Android是按照ARGB保存)
解决办法:
按照屏幕宽高来缩放
// 点击按钮开始加载 publicvoid load(View view) {
// Options 这个类里Google封装了解析图片的所有参数 Options opt = new Options();
// 设置为只读取照片宽高等其他信息,不读取内容 opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile("sdcard/bitmap2.jpg", opt); // 取得照片宽高 intimgH = opt.outHeight; intimgW = opt.outWidth; // 获取屏幕宽高 Display display = getWindowManager().getDefaultDisplay(); // 由于本Demo是为了解决低端机加载图片内存溢出,所以还用老方法,不用最新的方法取宽高 intscreenW =
display. intscreenH =
display. // 设置默认缩放比例为1 intscale = 1; // 取得宽高缩放比例 intscaleW = imgW / screenW; intscaleH = imgH / screenH;
// 让缩放比例为宽高中比例较大的 if (scaleW >= scaleH && scaleW > 1) { scale = scaleW; } elseif (scaleW <= scaleH && scaleH > 1) { scale = scaleH; } // 设置为读取照片全部信息 opt.inJustDecodeBounds = false; // 按照比例缩放 opt.inSampleSize = scale; Bitmap bp = BitmapFactory.decodeFile("sdcard/bitmap2.jpg", opt); ImageView imageView = (ImageView) findViewById(R.id.imageView1); imageView.setImageBitmap(bp); } |
图片大小的原理: