您的位置:首页 > 其它

优化图片内存占用

2017-03-22 17:53 302 查看
一,简介

        视图显示图片大小可能和图片原生的大小不一致,此时可以通过BitmapFactory根据所需要的大小动态加载图片,以此优化内存占用

二,代码

       

public Bitmap loadImg(Resources res, int id, int requestWidth, int requestHeight) {
BitmapFactory.Options  options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; //不加载图片,只获取图片原始大小

BitmapFactory.decodeResource(res, id, options);
int outHeight = options.outHeight;
int outWidth = options.outWidth;

options.inJustDecodeBounds = false;
options.inSampleSize = getSampleSize(options, requestWidth, requestHeight);
return  BitmapFactory.decodeResource(res, id, options);
}

private int getSampleSize(BitmapFactory.Options  options, int requestWidth, int requestHeight) {
int originWidth = options.outWidth;
int originHeight = options.outHeight;
int inSampleSize = 1;

if(originHeight <= requestHeight || originWidth <= requestWidth) {
return  inSampleSize;
}

while (originHeight >= requestHeight*2 && originWidth >= requestWidth*2) {
originHeight /= 2;
originWidth /= 2;

inSampleSize *= 2;
}

return inSampleSize;
}
    

       获取图片原始大小后,通过和所需要的大小进行比较,获取缩小比率,只能是2的倍数;

       之后修改BitmapFactory的Options的inSampleSize系数,加载图片;

三,使用bitmap

  

Bitmap bitmap = ResizeImageTool.getInstanse().loadImg(getResources(), R.drawable.list_bg, 960, 453);
int lastWidht = bitmap.getWidth();
int lastHeight = bitmap.getHeight();

TextView textView = (TextView) findViewById(R.id.test_img);
//textView.setBackground(new BitmapDrawable(bitmap));
//int textWdith = textView.getLayoutParams().width;
// int textheiht = textView.getLayoutParams().height;
BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
int textWdith = bitmapDrawable.getMinimumWidth();
int textheiht = bitmapDrawable.getMinimumHeight();
textView.setBackground(bitmapDrawable);


其中BitmapFactory.Options的inDensity和放置的图片目录有关系,inTargetDenisity和屏幕的系数有关系

加载后的bitmap大小根据 原始大小*(inTargetDenisity / inDensity); Bitmap的mDensity是屏幕本身的系数;

而最终的bitmapDrawable有mTargetDensity,它的值默认就是160,和设备无关,除非设置值; 最终获取的宽度和高度是  bitmap->width * (mTargetDensity / inTargetDenisity);所以如果不设置bitmapDrawable的情况下,图片的最终大小和设置无关,只和放置的目录有关
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: