Android中如何加载显示大尺寸图片不发生OOM

前言:当加载高清大图时,系统给每个应用分配的内存是有限的,如果一个资源图片太大,加载到内存中后,占用的内存空间也会很大,这样就会造成OOM。那在Android开发中如何正确加载高清大图呢?

                               采用BitmapFactory.Options进行采样率压缩处理

BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象,我们应该根据图片的来源选择合适的方法。这些方法会尝试为已经构建的bitmap分配内存,这时就会很容易导致OOM出现。为此每一种解析方法都提供了一个可选的BitmapFactory.Options参数,将这个参数的inJustDecodeBounds属性设置为true就可以让解析方法禁止为bitmap分配内存,返回值也不再是一个Bitmap对象,而是null。虽然Bitmap是null了,但是BitmapFactory.Options的outWidth、outHeight和outMimeType属性都会被赋值。这个技巧让我们可以在加载图片之前就获取到图片的长宽值和MIME类型,从而根据情况对图片进行压缩。
1、通过BitmapFactory.Options获取实际图片的宽高Android中如何加载显示大尺寸图片不发生OOM_第1张图片2、计算出压缩的比例inSampleSizeAndroid中如何加载显示大尺寸图片不发生OOM_第2张图片3、加载bitmap到imageview中Android中如何加载显示大尺寸图片不发生OOM_第3张图片
最终效果图:Android中如何加载显示大尺寸图片不发生OOM_第4张图片
这样的图片局部并不是很清晰,所以加载大图时,需要采用局部加载的方案。

                               使用BitmapRegionDecoder进行局部加载

BitmapRegionDecoder主要用于显示图片的某一块矩形区域,所以可以利用它来完成大图片的动态区域显示。
1、简单地使用BitmapRegionDecoder加载局部图片Android中如何加载显示大尺寸图片不发生OOM_第5张图片
原图以及效果图Android中如何加载显示大尺寸图片不发生OOM_第6张图片
2、自定义view通过滑动时获得的坐标不断设置矩形区域的偏移坐标,然后不断绘制View来完成动态显示大图的效果。
具体实现可以参考鸿神的博客https://blog.csdn.net/lmj623565791/article/details/49300989/

你可能感兴趣的:(Android基础,android,java,开发语言)