质量压缩
减少图片一个像素所占用的内存大小
RGB_565一个像素点占用2个byte,ARGB_8888占用4个byte,使用前者可以减少内存占用(在Bitmap.Config中设置)
ImageView的大小对内存没有影响,图片是存储在Bitmap里面的,只要优化Bitmap才能优化图片内存。
inJustDecodeBounds:BitmapFactory.Options中的属性,设置为true可以在不加载图片进内存的前提下获取图片的宽高;
inSampleSize:大于或等于2可以降低图片的采样率,节省内存。
图片存储优化的方式。
RGB_565一个像素占两个字节,ARGB_8888一个像素占4个字节,代码实现:options.inPreferredConfig设置
inSamplesize,图片的压缩比
injustDecodeBounds设置为true的意思是获取图片的宽高但不加载到内存
未压缩情况下条直接加载
第二张图片复用第一张图片内存
压缩方式实现
使用InBitmap就可以让三张图片占用一个内存,前提是后面两个图片占用内存小于第一个
从解码率方面如何对图片进行优化:RGB_565一个像素占两个字节,ARGB_8888一个像素占4个字节,代码实现:options.inPreferredConfig设置
优化方式一
图片OOM问题
OOM是指Android系统允许进程运行时所使用的内存,和手机本身系统没有关系。
产生
(1)一个页面一次加载过多图片。虽然每个图片的bitmap占用内存较小,但是如果图片过多也会oom
(2)加载大图片没有进行压缩
(3)类似ListView这种先后使用bitmap,但是先前的没有进行缓存。
2.解决
(1)尺寸压缩:通过增大inSampleSize来压缩
BitmapFactory.Options.inSampleSize
(2)质量压缩:减少图片一个像素所占用的内存大小
RGB_565一个像素点占用2个byte,ARGB_8888占用4个byte
Bitmap.Config.RGB_565
通常的例子如图所示
(3)内存重用:通常使用BitmapFactory.Options.inBitmap
BitmapFactory.Options options = new BitmapFactory.Options(); options.inBitmap = mBitmap; //重用了mBitmap的内存,注意当前decode出来的bitmap内存大小不能超过mBitmap Bitmap bitmap = BitmapFactory.decodeFile(..., options); //bitmap是新decode出来的。
问:解码率方面对图片进行优化
答:使用RGB_565替代ARGB_8888可以降低图片占用内存,RGB_565一个像素占两个字节,ARGB_8888一个像素占4个字节
内存重用
InBitmap: android 3.0之后才出现,有一个使用限制,使用InBitmap的那些图要小于或等于第一张图所占用的图片大小
imageView的大小不影响图片的内存,bitmap本身才是占用内存的因素
Bitmap3.0前后内存管理
一张图片所占的内存为:高X宽X每个像素占用的内存大小
Bitmap在3.0前后改变,以及对API调用的变化
从解码率方面对图片进行优化 答:使用RGB_565替代ARGB_8888降低图片占用内存