Bitmap内存占用
2018-03-30 17:42
176 查看
一、优先理解Bitmap内存中占用大小问题
1、图片内存占用基本算法。
Bitmap常用有ARGB_8888、ARGB_565模式。分别代表不同的图片质量。其对应的内存占用大小也不同ARGB_8888:透明:8红:8绿:8蓝:8即每一个颜色通道占用8位共32位(即4个字节,8位/字节),占用大小= WIDTH*HEIGHT*4RGB_565:红:5绿:6蓝:5总共16位(即2个字节),占用大小=WIDTH*HEIGHT*2在程序中可通过如下验证:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pw_icon); tvImgSize.setText(String.format("宽:%s\n高:%s\n大小:%s", bitmap.getWidth(), bitmap.getHeight(), bitmap.getByteCount())); /** * 宽:77 * 高:77 * 大小:77*77*4=23716b=23.1kb */2、图片位置对内存大小的影响
影响因素2点:①、(次要)当前设备自身dpi(可更改DPI)②、(主要)图片资源存放位置由于实际上decodeResource原码时间过程中调用decodeResourceStream方法,在未设置option时,会自动创建option,并通过inDensity和inTargetDensity计算缩放比例,因此下文提到的宽高并非完全对应图片资源的真实宽高像素数,但由于对应实现规则是不变的,因此不纳入影响因素当中。inDensity为当前资源所在目录影响,inTargetDensity为目标设备的实际密度DPI影响,实际密度DPI可通过下面两种方式得到。
adb shell wm density→ getResources().getDisplayMetrics().densityDpi;//手机当前设置的dip而非是真实物理dip(可修改)
以小米MIX为例,设备物理dpi(取决于硬件屏幕,不可更改)为365左右,对应XXhdpi资源,当图片资源位于XXhdpi目录下时,得到bitmap,大小约为宽×高×4当图片资源位于hdpi目录下时,得到bitmap,大小约为(宽×2)×(高×2)×4当图片资源位于XXXhdpi目录下时,得到的bitmap,大小约为(宽×0.75)×(高×0.75)×4
总结:系统会根据设备DPI(屏幕实际DPI)优先选择对应的资源目录选取图片,当图片位于高于当前对应等级时,或主动通过命令缩小当前设备的设置DPI,系统会认为图片是为更高dpi设备准备,所以会将图片缩小(内存占用变小)。当图片位于低于当前等级路径下时,或主动通过命令增大当前设备的设置DPI,系统则会对图片进行放大(内存占用变大)。Bitmap在内存中占用大小只与图片被加载时的尺寸质量等有关,与图片本身的大小无关,格式无关.
注:系统对图片查找顺序,对应等级→更高级→nodpi→低级递增,如:xxhdpi→xxxhdpi→nodpi→mdpi→hdpi→xxhdpi 缩放倍数关系为,dpi范围最大值的倍数关系dpi范围 | 密度 |
0dpi~120dpi | ldpi |
120dpi~160dpi | mdpi |
160dpi~240dpi | hdpi |
240dpi~320dpi | xhdpi |
320dpi~480dpi | xxhdpi |
480dpi~640dpi | xxxhdpi |
相关文章推荐
- 计算bitmap占用内存大小
- Bitmap的使用习惯——及时释放Bitmap占用的内存
- Bitmap那些事之内存占用计算和加载注意事项
- Android Bitmap占用内存计算公式
- android 获取Bitmap位图所占用的内存大小
- 安卓图片内存占用Bitmap.RGB_565 ARGB_4444 ARGB_8888
- Bitmap那些事之内存占用计算和加载注意事项
- Bitmap的使用习惯——及时释放Bitmap占用的内存
- Bitmap那些事之内存占用计算和加载注意事项
- Android 一张图片(BitMap)占用内存的计算 图片内存优化
- Bitmap占用内存大小的准确计算公式
- Bitmap占用内存计算
- 计算Bitmap占用的内存
- 使用不安全代码将 Bitmap 位图转为 WPF 的 ImageSource 以获得高性能和持续小的内存占用
- Bitmap占用内存过多的处理
- Bitmap那些事之内存占用计算和加载注意事项
- Bitmap那些事之内存占用计算和加载注意事项
- Bitmap那些事之内存占用计算和加载注意事项
- bitmap占用的内存: imgWidth*(targetDen/imgDen) * imgHeight(targetDen/imgDen) * imgPixByte