优化图片内存占用
2017-03-22 17:53
302 查看
一,简介
视图显示图片大小可能和图片原生的大小不一致,此时可以通过BitmapFactory根据所需要的大小动态加载图片,以此优化内存占用
二,代码
获取图片原始大小后,通过和所需要的大小进行比较,获取缩小比率,只能是2的倍数;
之后修改BitmapFactory的Options的inSampleSize系数,加载图片;
三,使用bitmap
其中BitmapFactory.Options的inDensity和放置的图片目录有关系,inTargetDenisity和屏幕的系数有关系
加载后的bitmap大小根据 原始大小*(inTargetDenisity / inDensity); Bitmap的mDensity是屏幕本身的系数;
而最终的bitmapDrawable有mTargetDensity,它的值默认就是160,和设备无关,除非设置值; 最终获取的宽度和高度是 bitmap->width * (mTargetDensity / inTargetDenisity);所以如果不设置bitmapDrawable的情况下,图片的最终大小和设置无关,只和放置的目录有关
视图显示图片大小可能和图片原生的大小不一致,此时可以通过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的情况下,图片的最终大小和设置无关,只和放置的目录有关
相关文章推荐
- Android资源图片内存占用及优化
- 优化 UWP 中图片的内存占用
- Android资源图片内存占用及优化
- Android优化图片加载所占用的内存
- Android资源图片内存占用及优化
- 如何优化图片占用的内存空间?
- 优化 UWP 中图片的内存占用
- Android资源图片内存占用及优化
- 【Unity3D游戏开发】性能优化之Texture图片空间和内存占用分析(三七)
- Android资源图片内存占用及优化
- 优化SQL Server的内存占用之执行缓存
- 火狐(Firefox)内存资源占用优化
- [Java] 查看java对象的内存占用情况--java 优化系列
- J2ME内存占用详解及优化方法
- 通过优化网页页面降低对内存及CPU的占用
- 减少windows7内存占用的优化方案 (内存占用才285兆 比XP还省)
- java优化占用内存的方法(一)
- nios中优化代码和减少程序占用内存空间的设置方法
- bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法
- [转]优化SQL Server的内存占用之执行缓存