当在android应用中加载一张高分辨率的图片时,十分容易出现Out of memory(OOM),这是由于内存溢出造成的,每个应用所使用的堆内存大小一般是固定的.
android在加载图片的时候是使用位图来放到内存中的,那位图在内存中的占用空间计算就是 分辨率*每个像素占用的内存.
1、降低图片加载到内存时的图片大小:
通过设置一个Options的属性inJustDecodeBounds=true,然后使用BitmapFactory.decodeXXX方法,让options作为参数,这样,我们在不分配内存的情况下,可以通过options读取图片的大小,outWidth和outHeight。其次通过原始图片的大小和你需要图片的大小来计算出需要缩放的比例。最后通过缩放比例值作为options.inSampleSize的值,再次调用BitmapFactory.decodeXXX,在调用方法前一定要设置inJustDecodeBounds=faluse。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(context.getResources(),resId,options);
int imageWidth = options.outWidth;
int sample = imageWidth / musicPicSize;
int dstSample = 1;
if (sample > dstSample) {
dstSample = sample;
}
options.inJustDecodeBounds = false;
//设置图片采样率
options.inSampleSize = dstSample;
//设置图片解码格式
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(context.getResources(),
resId, options), musicPicSize, musicPicSize, true);
2、采用节省内存的编码方式。在Options中,有一个inPreferredConfig属性,这个属性的值是一个Bitmap.Config,我们只需要给inPreferredConfig设置一个节省内存的编码就可以了,例如:options.inPreferredConfig=Bitmap.Config.ARGB_4444.这样就ok了。
ALPHA_8:每个像素占用1byte内存
ARGB_4444:每个像素占用2byte内存
ARGB_8888: 每个像素占用4byte内存
RGB_565:每个像素占用2byte内存