在Android系统中,图片都是以Bitmap的形式呈现在UI界面上的。Bitmap通常是比较消耗内存的,而Anroid APP 都有内存大小限制,所以当我们显示比较大的图片时很容易出现内存溢出的情况。下面就重点讲一讲如何更好地处理Bitmap图片。
1.高效加载大图
在很多情况下,提供的图片尺寸都要比展示在用户界面上的尺寸大。高分辨率的图片展示在低分辨率屏幕的手机上时,即使按照图片的尺寸完全加载,对用户来说也是没什么效果的,看到的仍然是低分辨率的图像。这个时候我们就要考虑有什么办法能够降低内存的使用,而又不影响图片展示的效果。显然,我们可以对图片进行压缩,使之最接近手机屏幕的分辨率。
读取图片的尺寸和类型信息
一种方法就是我们不先全部加载图片到内存,而是预先读取这张图片的尺寸和类型,然后和手机屏幕或者要显示图片的ImageView的尺寸比较,然后决定压缩的比例,这样可以避免内存溢出。代码如下:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//true 表示仅读取尺寸信息
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
计算压缩比例
我们已经知道了要加载的图片有多大了,同时我们还要知道目标尺寸该是多大。计算目标尺寸的大小不能仅仅考虑ImageView的尺寸,还要从以下几个方面考虑:
- 整张图片全尺寸加载需要消耗的内存大小
- 根据应用的内存限制,可以有多少内存用来加载该图片
- 要显示图片的ImageView或其他UI组件的尺寸
- 手机设备的屏幕尺寸和像素密度
考虑以上因素,可以得出目标尺寸大小。通常情况下,我们的目标尺寸取得都是ImageView的尺寸。计算压缩比例的代码如下:
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// 图片的原始宽高
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;//压缩比例,默认为不压缩
if (height > reqHeight || width > reqWidth) { //比较宽高
final int halfHeight = height / 2;
final