将inJustDecodeBounds设置为true,用于获取原始图片的高/宽
options.inJustDecodeBounds = true;
采样率为1时,即代表不缩放,默认大小。比如一张图片大小为102410244,内存占4MB。当它的采样率为2时,它的内存占5125124,1MB。相比较原图,它的大小为之前的1/2,内存为之前的1/4。缩放比例为4。
int InSampleSize = 1;
获取原始图片的高/宽
int Height = options.outHeight; int Width = options.outWidth;
private Bitmap LoadBitmapFromResource(Resources resources,int Res,int HopeHeight,int HopeWidth){ final BitmapFactory.Options options = new BitmapFactory.Options(); //用于解析图片的宽/高,并不会加载图片 options.inJustDecodeBounds = true; //从resources里面加载图片 BitmapFactory.decodeResource( resources,Res,options ); //计算采样率 options.inSampleSize = CalculateInSampleSize( options,HopeHeight,HopeWidth ); options.inJustDecodeBounds = false; return BitmapFactory.decodeResource( resources,Res,options ); } public static int CalculateInSampleSize(BitmapFactory.Options options,int HopeHeight,int HopeWidth){ //获取原始图片的宽/高 int Height = options.outHeight; int Width = options.outWidth; //采样率为1,即图片大小为原始尺寸 int InSampleSize = 1; //如果获取图片的原始高度大小你所期望的图片大小才有缩放的意义。 //如果大于的话,第一次获取它们的一般,然后除了采样率如果还大于期望的宽/高 //表示还可以继续缩小。采样率累乘2,InSampleSize的取值为1,2,4,8,16,32...其值为2的指数。 if (Height > HopeHeight && Width > HopeWidth){ int HalfHeight = Height / 2; int HalfWidth = Width / 2; while ((HalfHeight / InSampleSize ) >= HopeHeight && (HalfWidth / InSampleSize) >= HopeWidth){ InSampleSize *= 2; } } return InSampleSize; }
在需要的地方直接调用即可
UseBitmapFactory.setImageBitmap( LoadBitmapFromResource( getResources(), R.drawable.background,200,200) );